今天想从自己定义的资源文件中取出公司名称, 百度了下发现全是关于从资源文件中取得版本号的办法, 还好微软的MSDN给了我答案, 为了以后方便自己和别人, 就把这个函数贴出来.
希望百度能优化一下自己的搜索算法, 搜出来的结果几乎都是重复的, 想用能搜出来的结果用不了.百度的这一毛病也映射出了中国网民的复制粘贴的"情结"特别严重, 都是原样复制, 其中的错误都不改一下.
//////////////////////////////////////////////////////////////////////////
// 返回取得的在资源文件中定义的公司名称
//
CString CDelDirAndFilesApp::_GetCompanyName()
{
CString strResult = NULL, strVersion = NULL;
UINT uSize = NULL;
LPWSTR pCompany = NULL, pBuff=NULL;
TCHAR szAppPath[MAX_PATH] = { 0 };
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
::GetModuleFileName(NULL, szAppPath, MAX_PATH);
uSize = GetFileVersionInfoSizeEx(FILE_VER_GET_LOCALISED, szAppPath, 0); //获得全部资源版本信息的大小
pBuff = new WCHAR[uSize];
if (GetFileVersionInfoExW(FILE_VER_GET_LOCALISED, szAppPath, NULL, uSize, pBuff)) //获得全部资源版本信息
{
if (VerQueryValueW(pBuff, L"\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &uSize)) //获得资源中的语言代码页
{
strVersion.Format(L"\\StringFileInfo\\%04x%04x\\CompanyName", lpTranslate[0].wLanguage, lpTranslate[0].wCodePage);
if (!VerQueryValueW(pBuff, strVersion.GetBuffer(), (LPVOID*)&pCompany, &uSize)) //取得资源中的公司信息
AfxMessageBox(L"获取公司名称失败! ");
strResult = pCompany;
strVersion.ReleaseBuffer();
}
}
delete[]pBuff;
return CString(strResult);
}
备注:
由于GetFileVersionInfoSizeEx与GetFileVersionInfoEx只支持Windows Vista以后的系统, 所以该函数无法在xp系统中运行, 老系统怕是只能运行GetFileVersionInfoSize与GetFileVersionInfo两个函数.
参考链接:
http://msdn.microsoft.com/en-us/library/ms647464(v=vs.85).aspx
http://baike.baidu.com/view/1295784.htmfr=aladdin