获取程序运行exe的版本号,即rc文件里的版本号

datoulaile123 2020-01-17 03:40:04
目前我想实现个功能,在程序运行时获取自身的版本号,然后打印到日志里,便于看启动的程序是否是最新的
有什么好的方法或者API能拿到下图这个版本号吗,网上找的一些方法行不通

std::string strFilePath = GetRootPath();
strFilePath = strFilePath + PRODUCT_NAME + _T(".exe");

std::string version = GetFileVersion(strFilePath.c_str());//GetFileVersion函数这里有API或者什么好的方法实现吗

LOG_INFO(_T("Server[%s] start up OK."), version);
...全文
479 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
弓人水 2020-01-17
  • 打赏
  • 举报
回复

#include "windows.h"
#include "winver.h"

using namespace std;

string GetFileVersion(PCSTR filename)
{
string version = "";
VS_FIXEDFILEINFO *pVsInfo;
unsigned int iFileInfoSize = sizeof(VS_FIXEDFILEINFO);
int iVerInfoSize = GetFileVersionInfoSizeA(filename, NULL);
if(iVerInfoSize != 0)
{
char *pBuf = NULL;

while(!pBuf)
{
pBuf = new char[iVerInfoSize];
}
if(GetFileVersionInfoA(filename, 0, iVerInfoSize, pBuf))
{
if(VerQueryValueA(pBuf, "\\", (void **)&pVsInfo, &iFileInfoSize))
{
sprintf(pBuf, "%d.%d.%d.%d",
HIWORD(pVsInfo->dwFileVersionMS),
LOWORD(pVsInfo->dwFileVersionMS),
HIWORD(pVsInfo->dwFileVersionLS),
LOWORD(pVsInfo->dwFileVersionLS));
version = pBuf;
}
}
delete pBuf;
}
return version;
}
寻开心 2020-01-17
  • 打赏
  • 举报
回复
正打算写代码测试呢, 解决的倒是快
datoulaile123 2020-01-17
  • 打赏
  • 举报
回复
问题已经解决,留下解决的代码,供他人参考
std::string GetFileVersion()
{
TCHAR szFullPath[MAX_PATH];
DWORD dwVerInfoSize = 0;
DWORD dwVerHnd;
VS_FIXEDFILEINFO * pFileInfo;

::GetModuleFileName(NULL, szFullPath, sizeof(szFullPath));
dwVerInfoSize = ::GetFileVersionInfoSize(szFullPath, &dwVerHnd);
if (dwVerInfoSize)
{
// If we were able to get the information, process it:
HANDLE hMem;
LPVOID lpvMem;
unsigned int uInfoSize = 0;

hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
lpvMem = GlobalLock(hMem);
GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpvMem);

::VerQueryValue(lpvMem, (LPTSTR)_T("\\"), (void**)&pFileInfo, &uInfoSize);

WORD m_nProdVersion[4];

// Product version from the FILEVERSION of the version info resource
m_nProdVersion[0] = HIWORD(pFileInfo->dwProductVersionMS);
m_nProdVersion[1] = LOWORD(pFileInfo->dwProductVersionMS);
m_nProdVersion[2] = HIWORD(pFileInfo->dwProductVersionLS);
m_nProdVersion[3] = LOWORD(pFileInfo->dwProductVersionLS);

TCHAR strVersion[MAX_PROCEDUCT_VERSION] = {};

sprintf(strVersion, _T("%d.%d.%d.%d"), m_nProdVersion[0], m_nProdVersion[1], m_nProdVersion[2], m_nProdVersion[3]);

GlobalUnlock(hMem);
GlobalFree(hMem);

return strVersion;
//AfxMessageBox(strVersion);
}
return "";
}
datoulaile123 2020-01-17
  • 打赏
  • 举报
回复
引用 3 楼 寻开心 的回复:
https://blog.csdn.net/cxq_1993/article/details/47804679
GetFileVersionInfo这个windows api不好使?

GetFileVersionInfoSize 这个api不好使每次都返回0,用GetFileVersionInfoSizeA也一样
寻开心 2020-01-17
  • 打赏
  • 举报
回复
https://blog.csdn.net/cxq_1993/article/details/47804679
GetFileVersionInfo这个windows api不好使?
datoulaile123 2020-01-17
  • 打赏
  • 举报
回复
引用 1 楼 寻开心 的回复:
https://www.cnblogs.com/pythonschool/archive/2012/11/10/2764517.html

这个我试过了,可 //获取版本信息大小
dwSize = GetFileVersionInfoSize(strFilePath,NULL); 获取的长度每次都是0,很奇怪
寻开心 2020-01-17
  • 打赏
  • 举报
回复
https://www.cnblogs.com/pythonschool/archive/2012/11/10/2764517.html

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧