小编mrg*_*g95的帖子

WPD API检测设备是否是电话?

编辑:请求完整的源代码.下面是一个准系统实现,以便复制该错误.删除内容枚举,但无论如何崩溃都会在第一个对象调用上发生.在这种情况下,WPD_DEVICE_OBJECT_ID对象.

链接到CPP(Bug从第103行开始)

链接到QMAKE.PRO(我正在使用Qt)


在我的项目中,我使用WPD API来读取移动设备的内容.我遵循API到tee并成功实现了内容枚举.

但是,如果连接了USB驱动器,WPD API有时也会将其检测为设备.无论如何,我的程序将继续进行内容枚举.我不希望这样.我只想枚举移动设备.

问题是在内容枚举期间,当我的程序试图检索USB驱动器上的对象的属性时,它会崩溃.以下是崩溃详情:

Problem Event Name: BEX
Application Name:   UniversalMC.exe
Application Version:    0.0.0.0
Application Timestamp:  5906a8a3
Fault Module Name:  MSVCR100.dll
Fault Module Version:   10.0.40219.325
Fault Module Timestamp: 4df2be1e
Exception Offset:   0008af3e
Exception Code: c0000417
Exception Data: 00000000
OS Version: 6.1.7601.2.1.0.768.3
Locale ID:  1033
Additional Information 1:   185e
Additional Information 2:   185ef2beb7eb77a8e39d1dada57d0d11
Additional Information 3:   a852
Additional Information 4:   a85222a7fc0721be22726bd2ca6bc946
Run Code Online (Sandbox Code Playgroud)

此次调用发生崩溃:

hr = pObjectProperties->GetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, &objectName);
Run Code Online (Sandbox Code Playgroud)

hr 返回FAILED然后我的程序崩溃.

经过一些研究,我发现异常代码c0000417意味着发生了缓冲区溢出?如果我错了,请纠正我,但这是WPD …

c++ debugging exception buffer-overflow wpd

13
推荐指数
1
解决办法
433
查看次数

WPD对象文件名在'.'处截断

在我的项目中,我使用Windows便携设备(WPD)API来枚举移动设备的内容.WPD API枚举指南.我能够枚举每个对象并查看其属性,如API编程指南中所示.WPD API属性指南

但是,当我尝试获取名称中包含对象名称的对象.名称时,返回的值将被截断.

HRESULT hr = objectProperties->GetStringValue(WPD_OBJECT_NAME, &strOriginalFileName);
if(FAILED(hr))
    return false;

PWSTR wideStr = strOriginalFileName;
char buffer[20];
wcstombs(buffer, wideStr, 20);

qDebug() << buffer;
Run Code Online (Sandbox Code Playgroud)

因此,例如,com.example返回名称为的对象(设备上的文件夹)com.当我试图在设备上找到特定的文件路径时,这成为一个明显的问题.

我似乎无法弄清楚出了什么问题.我误解了文件名实际上是怎么回事?对象example内是另一个属性还是其他东西com?我很困惑.

编辑:所以我使用WPD API示例软件来检索com.example对象的所有对象属性,您可以看到WPD本身无法获取完整的文件夹名称. 在此输入图像描述

谢谢你的时间!

c++ qt wpd mtp

11
推荐指数
1
解决办法
420
查看次数

C++字符串太大,尾随字符被截断

我正在制作一个程序,在启动时,会将预定义的字符串写入文件.该文件大小约为5 mb,因此用十六进制填充5 mb数据字符串是一个很大的变量.当我尝试编译它时,我收到一个错误,说字符串太大了.5mb真的那么大吗?我将字符串分成4个部分,但每个部分仍然太大.:/我可以快速轻松地解决这个问题.

注意:我认为自己是初学程序员,所以尽量不要过头:P

我如何将字符串写入文件的示例:

string file_hex("huge_a**_string_goes_here_or_in_separate_cpp");

ofstream file_out;
file_out.open("tools\\c.exe", ios::binary | ios::trunc);
string res;
res.reserve(file_hex.size() / 2);
for (int i = 0; i < file_hex.size(); i += 2)
{
    std::istringstream iss(file_hex.substr(i, 2));
    int temp;
    iss >> std::hex >> temp;
    res += static_cast<char>(temp);
}

file_out << res;
file_out.close();
Run Code Online (Sandbox Code Playgroud)

c++ string size truncated

10
推荐指数
2
解决办法
1万
查看次数

使用qCompress使用GZip压缩字符串?

我有一个十六进制数据字符串(0a000a0165787a ...等),我写到这样的文件:

void Output(QString FilePath, QString Output)
{
    QFile file(FilePath);
    if(!file.open(QIODevice::WriteOnly))
    {
        qDebug() << "Error";
        return;
    }
    QByteArray array = QByteArray::fromHex(Output.toLatin1());
    file.write(array);
    file.flush();
    file.close();
}
Run Code Online (Sandbox Code Playgroud)

然后需要使用GZip压缩此文件.

我如何使用qCompress压缩此文件或压缩原始字符串?

谢谢你的时间 :)

c++ compression qt gzip bytearray

9
推荐指数
1
解决办法
6827
查看次数

QT_AUTO_SCREEN_SCALE_FACTOR 没有效果

我的软件在 Windows 7 及更高版本上运行,并使用 Qt 5.8 以 100% dpi 缩放(控制面板 > 放大或缩小文本和其他项目)开发。

当我的用户将他们的 dpi 缩放比例设置为 150% 时,所有文本和布局间距都会增加,正如他们应该的那样,但其他一切都没有受到影响。

结果是一个损坏的 GUI,文本对于其他元素来说太大了。

我已经尽可能多地进行了研究,“简单的修复”是将环境变量设置QT_AUTO_SCREEN_SCALE_FACTOR为 true。

qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1"); 是我在 main.cpp 中作为第一行添加的内容。

完全没有任何影响。唯一有任何影响的是,qputenv("QT_SCALE_FACTOR", "1.5");这绝对不是我想要的。

我如何告诉我的其余软件进行相应的扩展?

谢谢你的时间!

编辑:

这是我的错误https://bugreports.qt.io/browse/QTBUG-55654

c++ qt dpi

8
推荐指数
1
解决办法
9213
查看次数

如果从记事本/ Chrome复制,QClipboard无法获取剪贴板数据

在我的程序中,我的用户可以从任何地方复制一串文本并将其粘贴到我的程序中.我使用简单的QApplication::clipboard()->text();功能,一切都按预期工作.但是,我的一些用户在尝试复制和粘贴Windows 8.1时遇到问题

以下是我从粘贴功能访问剪贴板文本的方法:

QString clipboard = QApplication::clipboard()->text();

//check if the clipboard is empty
if(QApplication::clipboard()->text().isEmpty())
    return;

//do something with clipboard
Run Code Online (Sandbox Code Playgroud)

但如果文本是从记事本或Chrome复制的,则文本始终为空.Windows 7用户没有遇到任何问题.并非所有Windows 8用户都有这个问题,它只是少数但问题是一致的.从其他一些随机位置或我的程序本身复制时,剪贴板工作正常.

我试过用了mimeData.使用此功能时formats(),只有纯文本是可用格式,但文本始终为空.

从记事本/ Chrome复制的文本在剪贴板查看器和内容中显示正常,可以粘贴到其他程序的其他位置.

复制和粘贴是我的程序中非常重要的功能,令我很沮丧的是我的用户无法从记事本或Chrome复制和粘贴.

有任何想法吗?谢谢你的时间.:)

编辑:我尝试使用"Windows"风格的技术.没有变化.这是我目前仍然没有工作的代码:

QString clipboard = QApplication::clipboard()->text();

//check if the clipboard is empty
if(clipboard.isEmpty())
{
    //might not actually be empty. Check using the other technique
    if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL))
        {
            HGLOBAL hGlobal = GetClipboardData(CF_TEXT) ;//hGlobal is NULL
            if (hGlobal != NULL)//This never gets called because it is NULL
            { …
Run Code Online (Sandbox Code Playgroud)

c++ clipboard qt windows-8.1

7
推荐指数
1
解决办法
1895
查看次数

以低内存消耗从流中提取二进制值

我正在用ExpressJS构建NodeJS服务器,该服务器处理从桌面应用程序通过POST请求发送的数据(50KB> 100MB)进行处理和返回。桌面应用gzip在发送之前先压缩数据(50KB变为4KB)。

我希望服务器对数据进行解压缩,从数据中提取值(字符串,整数,字符,数组,json等),处理该数据,然后以处理后的数据进行响应。

我从这个开始:

apiRoute.route("/convert").post(bodyParser.raw({limit: '100Mb'}), (req, res) =>{
    let outputData;
    //extract values from req.body Buffer and do math on them.
    //save processed data in outputData

    res.json({
        status: true,
        data: outputData
    });
});
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为主体解析器将数据解压缩到req.body存储在内存中的缓冲区中。那是我的主要问题...内存使用率。我不想将整个数据集存储在内存中。


为了解决这个问题,我删除了body解析器,而是将请求流直接传递到zlib转换流中:

apiRoute.route("/convert").post((req, res) =>{
    req.pipe(zlib.createGunzip());
});
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我不知道如何从流中提取二进制值。


这就是我想要做的:

apiRoute.route("/convert").post((req, res) =>{
    let binaryStream = new stream.Transform();

    req
    .pipe(zlib.createGunzip())
    .pipe(binaryStream);

    let aValue = binaryStream.getBytes(20);//returns 20 bytes
    let bValue = binaryStream.getBytes(20000);//returns the next 20000 bytes
    //etc...

});
Run Code Online (Sandbox Code Playgroud)

但是我不知道有什么方法可以做到这一点。诸如Dissolve之类的模块已经关闭,但是它们要求您提前设置解析逻辑,并且 …

gzip asynchronous stream node.js express

7
推荐指数
1
解决办法
141
查看次数

(Qt C++)调整像素图并保持像素化?

在我的项目中,我有一个QLabel,我经常像这样更改像素图:

ui->frameLabel->setPixmap(slot_pic[blockId[currentSlot]][damageId[currentSlot]]);
Run Code Online (Sandbox Code Playgroud)

slot_pic只是一个二维地图.所以你可以这样看清楚:

ui->frameLabel->setPixmap(pixmap);
Run Code Online (Sandbox Code Playgroud)

图像尺寸为16x16,标签为32x32.我已经检查了scaledContents,所以当pixmap改变时,图像的大小是双倍的.但是,图像现在模糊了.我理解为什么,但我想知道是否有办法让它保持像素化.我想要一个更大的像素化图像.(图片来自Minecraft,如果这可以帮助你理解我的意思)

谢谢你的时间 :)

c++ qt interpolation qpixmap image-resizing

6
推荐指数
1
解决办法
9398
查看次数

让QPushButton隐形但仍然有效?

在我的项目中,我有一些按钮在可见和不可见之间变换使用:

ui->button->setVisible(true);
//or
ui->button->setVisible(false);
Run Code Online (Sandbox Code Playgroud)

然而,似乎当它们看不见时,它们也不起作用?我怎么能绕过这个?

我已经尝试过了:

ui->button->setEnabled(true);
Run Code Online (Sandbox Code Playgroud)

对于他们所有人,但没有任何变化.

c++ qt qpushbutton

5
推荐指数
1
解决办法
7762
查看次数

QFileSystemModel 自定义图标?

在我的项目中,我有一个 QTreeView 显示我的驱动器上的位置。我需要将文件的所有图标更改为自定义图标,但保留文件夹。

我重新实现了 QFileSystemModel 并且能够更改所有图标。有什么方法可以限制仅更改文件而不是文件夹吗?

QVariant MyQFileSystemModel::data(const QModelIndex& index, int role) const
{
    if(role == Qt::DecorationRole)
        return QPixmap(":/icons/TAG_Int.png");
    return QFileSystemModel::data(index, role);
}
Run Code Online (Sandbox Code Playgroud)

这:

在此输入图像描述

变成:

在此输入图像描述

如何只更改文件的图标?

谢谢你的时间 :)

c++ icons qt qfilesystemmodel

5
推荐指数
1
解决办法
3106
查看次数