2009-04-26 73 views
0

我试图从文件中获取版本信息。我的代码完全适用于我,但在其他几台机器上失败。因为我无法重现该错误,所以我花了相当长的时间找到问题。获取文件版本信息失败 - 但不适合我

有没有人看到有什么重大错误?

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

+0

对不起所有......原来所有的抱怨用户使用该程序的旧副本尚未实现此功能。 谢谢! – 2009-04-28 01:27:09

回答

0

nvm。似乎击败#1的挫折感了我如果不回答.....

Billy3

3

它看起来像你不检查来自众多系统的错误叫你正在使用。例如,GetFileVersionInfo将返回零,如果在获取数据时出错,此时您可以拨打GetLastError来查明具体故障是什么。同样,如果出现错误,GetFileVersionInfoSize将返回零。它看起来像你检查失败,但不打扰记录系统错误代码(再次,使用GetLastError检索该值)。

我建议你为正在使用的系统调用添加错误处理代码。很可能其中一个失败,并可能留下一个非常有意义的错误代码,供您检查GetLastError

4

尝试以下操作:

  • 使用GetLastError
  • 告诉我们是什么OS它适用于检索为GetFileVersion的失败的原因和它做什么OS不
  • 检查GetFileVersionInfo成功或不是(再次GetLastError
  • 阅读备注重复上述功能的MSDN文档的一节,并检查您是否是n失去了一些东西。
相关问题