首页 > 代码库 > 在VC程序中获得资源文件中定义的公司名称

在VC程序中获得资源文件中定义的公司名称

今天想从自己定义的资源文件中取出公司名称, 百度了下发现全是关于从资源文件中取得版本号的办法, 还好微软的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

在VC程序中获得资源文件中定义的公司名称