// 首先调用GetFileVersionInfoSize获取版本号长度 String MyName = "C://Maxthon.exe"; DWORD NoUse = 0; //没有什么用 DWORD InfoSize = ::GetFileVersionInfoSize(MyName.c_str(), &NoUse); // 有效的长度 if (InfoSize > 0) { auto_ptr<char> VersionInfo(new char[InfoSize]); if(true == ::GetFileVersionInfo(MyName.c_str(),NoUse,InfoSize,VersionInfo.get())) // 获取版本信息成功 { char *pValue = NULL; UINT ValueLen; String FileInfo = "//StringFileInfo//";
//抄MSDN的代码 struct LANGANDCODEPAGE { WORD wLanguage; WORD wCodePage; } *lpTranslate;
//default 0x0804 /StringFileInfo/lang-codepage/string-name if (true == ::VerQueryValue(VersionInfo.get(), "//VarFileInfo//Translation", (LPVOID *)&lpTranslate, &ValueLen)) { if (ValueLen / sizeof(LANGANDCODEPAGE) >= 1) { FileInfo = FileInfo + IntToHex(lpTranslate[0].wLanguage, 4)+ IntToHex(lpTranslate[0].wCodePage,4) + "//"; // 这一步很关键哦
if (true == ::VerQueryValue(VersionInfo.get(), String(FileInfo + "ProductName").c_str(), (LPVOID *)&pValue, &ValueLen)) // 获取ProductName信息,ProductVersion等 { String sSoftwareName = String(pValue); // 软件名称 } } }