我想要通过VerQueryValue获取文件信息,因此写了一个GetFileVersion函数。这对于部分exe文件时可行的,但是不适用于全部。
我总共尝试获取了五个文件的信息,但只成功了三个。GetLastError显示为ERROR_RESOURCE_TYPE_NOT_FOUND(找不到资源类型),请帮忙分析下哪里出了问题。。
尤其是QQ\unins000.exe,这个程序甚至有不同于文件名的文件描述,却无法提取。
(系统显示其文件描述为Setup/Uninstall)
下面为我的源码
//main
cout<<GetFileVersion("C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe")<<endl;
cout<<GetFileVersion("C:\\Program Files (x86)\\Dev-Cpp\\devcpp.exe")<<endl;
cout<<GetFileVersion("C:\\Program Files (x86)\\360\\360safe\\360Safe.exe")<<endl;
cout<<GetFileVersion("C:\\Program Files (x86)\\Tencent\\QQ\\unins000.exe")<<endl;
cout<<"\tErrorCode:"<<GetLastError()<<endl;
cout<<GetFileVersion("C:\\Program Files (x86)\\Dev-Cpp\\devcppPortable.exe")<<endl;
cout<<"\tErrorCode:"<<GetLastError()<<endl;
string GetFileVersion(char *strFilePath){
DWORD dwSize;
DWORD dwRtn;
std::string szVersion;
//获取版本信息大小
dwSize = GetFileVersionInfoSize(strFilePath, NULL);
if (dwSize == 0)
{
return "Error: 读取文件失败!";
}
char *pBuf;
pBuf = new char[dwSize + 1];
if (pBuf == NULL)
return "";
memset(pBuf, 0, dwSize + 1);
//获取版本信息
dwRtn = GetFileVersionInfo(strFilePath, 0, dwSize, pBuf);
if (dwRtn == 0){
return "Error: 版本信息获取失败";
}
LPVOID lpBuffer = NULL;
UINT uLen = 0;
//版本资源中获取信息
dwRtn = VerQueryValue(pBuf,
"\\StringFileInfo\\080404b0\\FileDescription",//中文
&lpBuffer,
&uLen);
if (dwRtn == 0)
{
dwRtn = VerQueryValue(pBuf,
"\\StringFileInfo\\040904e4\\FileDescription",//英文
&lpBuffer,
&uLen);
if(!dwRtn)return "Error: Unknown Lang codepage";
}
szVersion = (char *)lpBuffer;
delete pBuf;
return szVersion;
}
另外,有没有人知道日语和中文繁体的lang_codepage是什么啊,我只知道四位分别是0411和0404,后四位不知道啊。。
最后劳烦一位巨佬看看有没有什么办法。。@浪客