c++ - 版本信息表 通过 UpdateResource 更改 pe 文件?

标签 c++ winapi resources portable-executable

我正在正确运行程序并且我看到了版本信息,但是在更新资源 api 中运行并且没有替换 compnayname。

LPCWSTR filename = _T("r1.exe");
size = GetFileVersionInfoSize(filename, &dwHandle);
std::vector<BYTE> fileInfo(size,0);
f = GetFileVersionInfo(filename, 0, size, &fileInfo[0]);
VerQueryValue(&fileInfo[0], TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&pValueBuffer, &verLength);
SubBlock.Format(_T("\\StringFileInfo\\040904B0\\CompanyName"), "0x0409", "1200");
VerQueryValue(&fileInfo[0], SubBlock, (LPVOID *)&lpBuffer, &dwBytes);
ZeroMemory(lpBuffer, _tcslen(lpBuffer) * sizeof(TCHAR));
_tcscpy(lpBuffer, _T("My Company"));
HANDLE hResource = BeginUpdateResource(filename, FALSE);
VerQueryValueW(&fileInfo[0], TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&pValueBuffer, &verLength);
f=UpdateResource(hResource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), MAKELANGID(SUBLANG_ENGLISH_UK, SUBLANG_DEFAULT), &fileInfo[0], sizeof(lpBuffer));

EndUpdateResource(hResource, FALSE);

如何替换公司名称或其他字符串信息表功能????

最佳答案

您的代码片段没有达到您的预期。

BeginUpdateResourceUpdateResourceEndUpdateResource 确实执行更新周期,并且您以可能正确的顺序使用 API。但是,您的 UpdateResource 使用您从文件中读取的相同原始数据 block 。

VerQueryValue 为您提取字符串,但不为您提供更新原始 block 中值的方法

如果你想更新资源,你有责任读取整个VERSIONINFO 资源,将其解析成多个部分,更新有问题的字符串,将资源组装回字节缓冲区,然后然后使用 UpdateResource API。据我所知,没有 API 可以帮助您端到端地解析和组装 VERSIONINFO 数据,您有责任按照 MSDN 数据结构自行处理(这是可行的)。

关于c++ - 版本信息表 通过 UpdateResource 更改 pe 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47000945/

相关文章:

c++ - 如何创建 QKeySequence 像 "Fn"+ Key_Up

c++ - 当前渲染视频卡

c++ - 如何在我的项目中嵌入 bat 文件?

c++ - 使用 GetQueuedCompletionStatusEx 将多个完成从队列中取出

c++ - 在输出文件名中使用测试用例名称

c++ - 如何在 Microsoft Visual Studio 中加载 .xml 文件

c++ - 如何获得使用 TextOut 打印的字符之间的间距?

jsf - 带字符串查询的@ResourceDependency

java - Windows Jenkins 服务 org.eclipse.swt.SWTError : No more handles

java - 我如何正确地使用 Log4j,关闭所有 Appender 并因此关闭文件