我试图从文件中获取版本信息。我的代码完全适用于我,但在其他几台机器上失败。因为我无法重现该错误,所以我花了相当长的时间找到问题。获取文件版本信息失败 - 但不适合我
有没有人看到有什么重大错误?
LPBYTE versionInformationBlock;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *langBlockPointer;
UINT translationsCount;
void fileData::enumVersionInformationBlock()
{
bits.set(VERSIONINFOCHECKED);
disable64.disableFS(); //Shut down WOW64
DWORD zero = 0;
DWORD lengthOfVersionData =
GetFileVersionInfoSize(getFileName().c_str(),&zero);
if (!lengthOfVersionData)
{
disable64.enableFS();
return;
}
versionInformationBlock = new BYTE[lengthOfVersionData];
GetFileVersionInfo(getFileName().c_str(),zero,lengthOfVersionData,versionInformationBlock);
VerQueryValue(versionInformationBlock,L"\\VarFileInfo\\Translation",(LPVOID*)&langBlockPointer,&translationsCount);
translationsCount /= sizeof(struct LANGANDCODEPAGE);
disable64.enableFS();
}
std::wstring fileData::getVersionInformationString(const std::wstring& str)
{
if (!bits[VERSIONINFOCHECKED])
enumVersionInformationBlock();
if (!versionInformationBlock)
return L"!VERINFO: NOT PE FILE!";
LPCTSTR retString;
UINT retStringLength;
std::wstring result;
static const wchar_t hexChars[] = L"ABCDEF";
wchar_t hexLanguage[26] = L"\\StringFileInfo\\ \\";
for(size_t idx = 0; idx < translationsCount; idx++)
{
hexLanguage[16] = *(hexChars + ((langBlockPointer[idx].wLanguage >> 12) & 0x0F));
hexLanguage[17] = *(hexChars + ((langBlockPointer[idx].wLanguage >> 8) & 0x0F));
hexLanguage[18] = *(hexChars + ((langBlockPointer[idx].wLanguage >> 4) & 0x0F));
hexLanguage[19] = *(hexChars + (langBlockPointer[idx].wLanguage & 0x0F));
hexLanguage[20] = *(hexChars + ((langBlockPointer[idx].wCodePage >> 12) & 0x0F));
hexLanguage[21] = *(hexChars + ((langBlockPointer[idx].wCodePage >> 8) & 0x0F));
hexLanguage[22] = *(hexChars + ((langBlockPointer[idx].wCodePage >> 4) & 0x0F));
hexLanguage[23] = *(hexChars + (langBlockPointer[idx].wCodePage & 0x0F));
std::wstring targetResource(hexLanguage,25);
targetResource.append(str);
if (!VerQueryValue(versionInformationBlock,targetResource.c_str(),(LPVOID *)&retString,&retStringLength))
{
return std::wstring(L"!DOESN'T APPER TO EXIST IN FILE! ERROR: ").append(boost::lexical_cast<std::wstring>(GetLastError()));
}
retStringLength--;
if (!result.empty())
result.append(L"/");
std::wstring toAppend;
toAppend.assign(retString,retStringLength);
boost::algorithm::trim(toAppend);
result.append(toAppend);
}
return result;
}
std::wstring fileData::getVerCompany()
{
return getVersionInformationString(L"CompanyName");
}
~fileData()
{
if (versionInformationBlock)
delete [] versionInformationBlock;
};
真正搞砸我的是它没有抛出任何错误信息......它一直在返回垃圾。
任何想法?
Billy3
对不起所有......原来所有的抱怨用户使用该程序的旧副本尚未实现此功能。 谢谢! – 2009-04-28 01:27:09