通过exe文件,获取程序版本号,公司名称等信息
2016-01-07 15:40
393 查看
//获取 文件版本号的 // pName _T("CompanyName"),_T("FileDescription"),_T("FileVersion"), // _T("InternalName"),_T("LegalCopyright"),_T("OriginalFilename"), // _T("ProductName"),_T("ProductVersion"), BOOL CTrayMgrDlg::GetFileVersionString(CHAR * pFileName, _bstr_t * pRecvStr, TCHAR * pName /* = NULL */) { DWORD dwDummyHandle; // will always be set to zero DWORD dwLen; BYTE * pVersionInfo; BOOL bRetVal; VS_FIXEDFILEINFO FileVersion; *pRecvStr = ""; struct TRANSLATION { WORD langID; // language ID WORD charset; // character set (code page) } Translation; HMODULE hVerDll; hVerDll = LoadLibrary(_T("VERSION.dll")); if(hVerDll == NULL) return FALSE; typedef DWORD (WINAPI *Fun_GetFileVersionInfoSizeA)(CHAR *, DWORD *); typedef BOOL (WINAPI *Fun_GetFileVersionInfoA)(CHAR *, DWORD, DWORD, LPVOID); typedef BOOL (WINAPI *Fun_VerQueryValueA)(LPVOID, CHAR *, LPVOID, PUINT); Fun_GetFileVersionInfoSizeA pGetFileVersionInfoSizeA; Fun_GetFileVersionInfoA pGetFileVersionInfoA; Fun_VerQueryValueA pVerQueryValueA; pGetFileVersionInfoSizeA = (Fun_GetFileVersionInfoSizeA)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeA"); pGetFileVersionInfoA = (Fun_GetFileVersionInfoA)::GetProcAddress(hVerDll, "GetFileVersionInfoA"); pVerQueryValueA = (Fun_VerQueryValueA)::GetProcAddress(hVerDll, "VerQueryValueA"); Translation.langID = 0x0409; // Translation.charset = 1252; // default = ANSI code page dwLen = pGetFileVersionInfoSizeA(pFileName, &dwDummyHandle); if (dwLen == 0) return FALSE; pVersionInfo = new BYTE[dwLen]; // allocate version info bRetVal = pGetFileVersionInfoA(pFileName, 0, dwLen, pVersionInfo); if(bRetVal == FALSE) { delete [] pVersionInfo; return FALSE; } VOID * pVI; UINT uLen; bRetVal = pVerQueryValueA(pVersionInfo, "\\", &pVI, &uLen); if(bRetVal == FALSE) { delete [] pVersionInfo; return FALSE; } memcpy(&FileVersion, pVI, sizeof(VS_FIXEDFILEINFO)); bRetVal = pVerQueryValueA(pVersionInfo, "\\VarFileInfo\\Translation", &pVI, &uLen); if(bRetVal && uLen >= 4) { memcpy(&Translation, pVI, sizeof(TRANSLATION)); } // BREAKIF(FileVersion.dwSignature != VS_FFI_SIGNATURE); if (FileVersion.dwSignature != VS_FFI_SIGNATURE) { return FALSE; } CHAR szQuery[1024]; CHAR * pVal; UINT iLenVal; if(pName == NULL) { sprintf(szQuery, "%d.%d.%d.%d", HIWORD(FileVersion.dwFileVersionMS), LOWORD(FileVersion.dwFileVersionMS), HIWORD(FileVersion.dwFileVersionLS), LOWORD(FileVersion.dwFileVersionLS)); *pRecvStr = szQuery; } else { _bstr_t bStrNtyLine1 = pName; sprintf(szQuery, "\\StringFileInfo\\%04X%04X\\%s", Translation.langID, Translation.charset, (CHAR *)bStrNtyLine1); bRetVal = pVerQueryValueA(pVersionInfo, szQuery, (LPVOID*)&pVal, &iLenVal); if(bRetVal) *pRecvStr = pVal; else *pRecvStr = ""; } delete [] pVersionInfo; return TRUE; }转自http://blog.csdn.net/zhice163/article/details/7417911
相关文章推荐
- mysql修改密码 创建数据库 添加新用户
- 9.UITextField的基本使用
- linux
- 《swift2.0 官方教程中文版》 第3章-05模式
- 使用jquery实现表单点击进入、移出变色效果(一)
- iOS开发判断手机号格式
- LeetCode:Generate Parentheses
- 修改Linux的root用户面
- plsql developer远程连接oracle数据库
- Go语言编程入门超级指南
- 简单的Windows应用程序命名规则
- 安卓广告轮播图
- 如下是各种获取页面和项目的路径和链接路径:
- ext弹出框
- 跟我一起写 Makefile(十四)
- windows8.1+ubuntu 14.04双系统安装
- Html5 屏幕旋转事件
- Best-First求解八数码问题
- Spring MVC 学习笔记(二)
- IO库 8.5