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

时间:2017-10-29 13:51:34

标签: 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);

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

2 个答案:

答案 0 :(得分:3)

您的代码段不符合您的预期。

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

VerQueryValue 提取字符串,但没有为您提供更新原始数据块中的值的方法

如果要更新资源,则负责读取整个VERSIONINFO资源,将其解析为部分,更新有问题的字符串,将资源组装回字节缓冲区,然后使用UpdateResource API。没有API,据我所知,它可以帮助您解决和汇总VERSIONINFO数据的端到端,您有责任根据MSDN数据结构自行处理(并且它可行)。

答案 1 :(得分:2)

GetFileVersionInfo[Size]VerQueryValue函数abstract away某些资源版本布局详细信息,并且在您要构建资源时无法使用。您可以使用它们来读取您是否真的想要但是如果要更新它,则必须在内存中手动创建完整版本资源,因为1)存在一些对齐要求和2)它将字符串大小存储在字符串标题中。

MSDN has decent documentation应该可以帮助你在记忆中正确地解决问题。它以VS_VERSIONINFOVS_FIXEDFILEINFO开头,其余的不是真正的C / C ++兼容结构,但您可以在十六进制编辑器中学习其他资源,以确保您正确地执行此操作。