[英]Retrieve File Description for an Application using VerQueryValue
我真的對這個功能感到困惑。 目前我成功檢索了FileVersion
和ProductVersion
。 現在我想在應用程序中檢索更多信息,例如FileDescription
和CompanyName
。
DWORD dwLen;
VS_FIXEDFILEINFO *pFileInfo;
UINT pLenFileInfo;
dwLen = GetFileVersionInfoSize("D:/firefox.exe", NULL);
BYTE *sKey = new BYTE[dwLen];
GetFileVersionInfo("D:/firefox.exe", NULL, dwLen, sKey);
VerQueryValue(sKey, "\\", (LPVOID*)&pFileInfo, &pLenFileInfo);
// at now i can retrieve file Version with structure VS_FIXEDFILEINFO
VerQueryValue(sKey, "\\StringFileInfo\\%04x%09x\\FileDescription", (LPVOID*) &pFileInfo, &pLenFileInfo);
delete[] sKey;
cout << pFileInfo;
// it return address buffer `00230428`;
我究竟如何才能返回FileDescription
,如Firefox
? 什么結構用於檢索第三個LPVOID
參數中的FileDescription
? 在我的代碼中,我將pFileInfo
兩次傳遞給VerQueryValue()
。
編輯:
DWORD dwLen;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
dwLen = GetFileVersionInfoSize("D:/firefox.exe", NULL);
BYTE *sKey = new BYTE[dwLen];
TCHAR *sCompanyName = new char[1024];
GetFileVersionInfo("D:/firefox.exe", NULL, dwLen, sKey);
VerQueryValue(sKey, "\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &pLenFileInfo);
VerQueryValue(test, "\\StringFileInfo\\%04x%09x\\FileDescription", (LPVOID*)&sCompanyName, &pLenFileInfo);
delete[] sKey;
cout << lpTranslate -> wLanguage;
VerQueryValue(test, "\\\\StringFileInfo\\\\%04x%09x\\\\FileDescription", (LPVOID*)&sCompanyName, &pLenFileInfo);
第二個參數應該是"\\\\StringFileInfo\\\\NxM\\\\FileDescription"
格式,其中N
和M
是wLanguage
和wCodePage
。 按照注釋部分中的示例,您可以使用"%04x%04x"
作為打印格式說明符來創建字符串。 例子:
BOOL foo()
{
const char* filename = "c:\\windows\\hh.exe";
int dwLen = GetFileVersionInfoSize(filename, NULL);
if(!dwLen)
return 0;
auto *sKey = new BYTE[dwLen];
std::unique_ptr<BYTE[]> skey_automatic_cleanup(sKey);
if(!GetFileVersionInfo(filename, NULL, dwLen, sKey))
return 0;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
UINT cbTranslate = 0;
if(!VerQueryValue(sKey, "\\VarFileInfo\\Translation",
(LPVOID*)&lpTranslate, &cbTranslate))
return 0;
for(unsigned int i = 0; i < (cbTranslate / sizeof(LANGANDCODEPAGE)); i++)
{
char subblock[256];
//use sprintf if sprintf_s is not available
sprintf_s(subblock, "\\StringFileInfo\\%04x%04x\\FileDescription",
lpTranslate[i].wLanguage, lpTranslate[i].wCodePage);
char *description = NULL;
UINT dwBytes;
if(VerQueryValue(sKey, subblock, (LPVOID*)&description, &dwBytes))
MessageBox(0, description, 0, 0);
}
return TRUE;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.