查找网上资源甚多,但无一个代码能用,甚憾。自已阅读MSDN资料,终于写得下面代码,经测试通过,若有问题请发邮件给我,谢谢!
struct LANGANDCODEPAGE
{
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
void GetInfoFromExeAndDll(PCTSTR pcszFileName)
{
DWORD dwSize = 0;
UINT uiSize = GetFileVersionInfoSize(pcszFileName,&dwSize);
if (0 == uiSize)
{
//0 意味着GetFileVersionInfoSize 函数调用失败
return;
}
PTSTR pBuffer = new TCHAR[uiSize];
if (NULL == pBuffer)
{
//分配内存失败:)
return ;
}
memset((void*)pBuffer,0,uiSize);
//获取exe 或 DLL 的资源信息,存放在pBuffer内
if(!GetFileVersionInfo(pcszFileName,0,uiSize,(PVOID)pBuffer))
{
//GetFileVersionInfo 调用失败.
return ;
}
LANGANDCODEPAGE *pLanguage = NULL; //这里这样设置没关系了。
UINT uiOtherSize = 0;
//获取资源相关的 codepage 和language
if (!VerQueryValue(pBuffer,_T("//VarFileInfo//Translation"),
(PVOID*)&pLanguage,&uiOtherSize))
{
//出错
return;
}
//
//
//超级重点
PVOID pTmp = NULL; //一定要把pTmp这个变量设置成PVOID或LPVOID型的
//否则无法获取信息。你不信可以试。
//TCHAR *pTmp = NULL;
//或下面这样的设置
//TCHAR pTmp[MAX_PATH];
//memset((void*)pTmp,0,sizeof(pTmp));
//
//
TCHAR SubBlock[MAX_PATH];
memset((void*)SubBlock,0,sizeof(SubBlock));
for(UINT i=0; i < (uiOtherSize / sizeof(LANGANDCODEPAGE)); i++ )
{
//获取每种 CodePage 和 Language 资源的相关信息
wsprintf(SubBlock,
TEXT("//StringFileInfo//%04x%04x//OriginalFilename"),
pLanguage[i].wLanguage,
pLanguage[i].wCodePage);
// Comments InternalName ProductName
// CompanyName LegalCopyright ProductVersion
// FileDescription LegalTrademarks PrivateBuild
// FileVersion OriginalFilename SpecialBuild
// OriginalFilename 可由上面的各种代替。
// Retrieve file description for language and code page "i".
VerQueryValue(pBuffer,
SubBlock,
(PVOID*)&pTmp,
&uiOtherSize);
TCHAR chOriginalFileName[MAX_PATH];
memset((void*)chOriginalFileName,0,sizeof(chOriginalFileName));
_tcscpy(chOriginalFileName,(TCHAR*)pTmp);
MessageBox(NULL,chOriginalFileName,_T("Succeed!"),MB_OK);
}
delete []pBuffer;
pBuffer = NULL;
}
记得在Project->Settings->Linking 的Object/library modules 内输入 version.lib这个库。
当然头文件需加上#include <tchar.h>
和 #include <windows.h>
其余的就没什么了。希望能对你有帮助。