今天想从自己定义的资源文件中取出公司名称, 百度了下发现全是关于从资源文件中取得版本号的办法, 还好微软的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.htm?fr=aladdin
时间: 2024-10-18 08:00:57