编辑:请求完整的源代码.下面是一个准系统实现,以便复制该错误.删除内容枚举,但无论如何崩溃都会在第一个对象调用上发生.在这种情况下,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 …
在我的项目中,我使用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本身无法获取完整的文件夹名称.
谢谢你的时间!
我正在制作一个程序,在启动时,会将预定义的字符串写入文件.该文件大小约为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) 我有一个十六进制数据字符串(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压缩此文件或压缩原始字符串?
谢谢你的时间 :)
我的软件在 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");
这绝对不是我想要的。
我如何告诉我的其余软件进行相应的扩展?
谢谢你的时间!
编辑:
在我的程序中,我的用户可以从任何地方复制一串文本并将其粘贴到我的程序中.我使用简单的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) 我正在用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之类的模块已经关闭,但是它们要求您提前设置解析逻辑,并且 …
在我的项目中,我有一个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,如果这可以帮助你理解我的意思)
谢谢你的时间 :)
在我的项目中,我有一些按钮在可见和不可见之间变换使用:
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)
对于他们所有人,但没有任何变化.
在我的项目中,我有一个 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)
这:
变成:
如何只更改文件的图标?
谢谢你的时间 :)