64,637
社区成员
发帖
与我相关
我的任务
分享
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);
#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;
}
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 "";
}