使用VerQueryValue检索应用程序的文件描述
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`;
我怎样才能像返回Firefox
一样返回FileDescription
?使用什么结构来检索第三个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;
}
相关文章:
- 使用VerQueryValue检索应用程序的文件描述
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- I2C 文件描述符上的 I2C 总线可写/可读标志
- 许多文件描述符在调用sys_clone时
- AMQP-CPP >处理程序中的错误文件描述符
- 如何使用 WINAPI 和 C++ 提取可执行文件的文件描述?
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 如何强制文件描述符缓冲我的输出
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- 哪个更适合从C++写入敏感的日志文件,在文件描述符上写()或文件上的fprintf()?
- 将 select() 与非基于文件描述符的输入一起使用
- accept(..) 似乎正在修改我给它的文件描述符参数
- 使用 Select 多路复用未命名的管道和其他文件描述符
- 提升 ASIO 绑定:错误的文件描述符
- 使用文件描述符移动对象
- 无法从零MQ ZMQ_SERVER套接字中获取文件描述符
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 我可以在不使用 FIOCANCEL 的情况下关闭 VxWorks 中的文件描述符吗?
- 将 Boost Asio 与 ZeroMQ 集成,文件描述符错误?