我正在正确运行程序并且我看到了版本信息,但是在更新资源 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);
如何替换公司名称或其他字符串信息表功能????
最佳答案
您的代码片段没有达到您的预期。
BeginUpdateResource
、UpdateResource
、EndUpdateResource
确实执行更新周期,并且您以可能正确的顺序使用 API。但是,您的 UpdateResource
使用您从文件中读取的相同原始数据 block 。
VerQueryValue
为您提取字符串,但不为您提供更新原始 block 中值的方法。
如果你想更新资源,你有责任读取整个VERSIONINFO
资源,将其解析成多个部分,更新有问题的字符串,将资源组装回字节缓冲区,然后然后使用 UpdateResource
API。据我所知,没有 API 可以帮助您端到端地解析和组装 VERSIONINFO
数据,您有责任按照 MSDN 数据结构自行处理(这是可行的)。
关于c++ - 版本信息表 通过 UpdateResource 更改 pe 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47000945/