//exepath 为程序路径(绝对路径)
std::string GetSoftVersion(const char *exepath)
{
std::string strVersionInfo;
if (!exepath)
return strVersionInfo;
if (_access(exepath, 0) != 0)
return strVersionInfo;
HMODULE hDll = NULL;
char szDbgHelpPath[MAX_PATH];
sprintf_s(szDbgHelpPath, sizeof(szDbgHelpPath), "version.dll");
hDll = ::LoadLibraryA( szDbgHelpPath );
if (hDll == NULL)
{
return strVersionInfo;
}
typedef DWORD (WINAPI *func_GetFileVersionInfoSizeA)(LPCSTR ,LPDWORD );
func_GetFileVersionInfoSizeA p_GetFileVersionInfoSizeA =
(func_GetFileVersionInfoSizeA)::GetProcAddress( hDll, "GetFileVersionInfoSizeA" );
typedef DWORD (WINAPI *func_GetFileVersionInfoA)(LPCSTR , DWORD , DWORD , LPVOID );
func_GetFileVersionInfoA p_GetFileVersionInfoA =
(func_GetFileVersionInfoA)::GetProcAddress( hDll, "GetFileVersionInfoA" );
typedef DWORD (WINAPI *func_VerQueryValueA)(LPCVOID , LPCSTR , LPVOID *, PUINT );
func_VerQueryValueA p_VerQueryValueA =
(func_VerQueryValueA)::GetProcAddress( hDll, "VerQueryValueA" );
if(p_GetFileVersionInfoSizeA == NULL
|| p_GetFileVersionInfoA == NULL
|| p_VerQueryValueA == NULL)
{
if(hDll)
{
FreeLibrary(hDll);
hDll = NULL;
}
return strVersionInfo;
}
UINT infoSize = p_GetFileVersionInfoSizeA(exepath, 0);
if (infoSize != 0) {
strVersionInfo.resize(infoSize, 0);
char *pBuf = NULL;
pBuf = new char[infoSize];
VS_FIXEDFILEINFO *pVsInfo;
if (p_GetFileVersionInfoA(exepath, 0, infoSize, pBuf)) {
if (p_VerQueryValueA(pBuf, "\\", (void **)&pVsInfo, &infoSize))
{
sprintf_s(pBuf, infoSize,"%d.%d.%d.%d",
HIWORD(pVsInfo->dwFileVersionMS),
LOWORD(pVsInfo->dwFileVersionMS),
HIWORD(pVsInfo->dwFileVersionLS),
LOWORD(pVsInfo->dwFileVersionLS));
strVersionInfo = pBuf;
}
}
delete[] pBuf;
}
if(hDll)
{
FreeLibrary(hDll);
}
return strVersionInfo;
}