char szFullPath[MAX_PATH];
DWORD dwVerInfoSize = 0;
DWORD dwVerHnd;
VS_FIXEDFILEINFO * pFileInfo; GetModuleFileName(GetDllInstance(), 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); int nVer0 = HIWORD(pFileInfo->dwProductVersionMS);
int nVer1 = LOWORD(pFileInfo->dwProductVersionMS);
int nVer2 = HIWORD(pFileInfo->dwProductVersionLS);
int nVer3 = LOWORD(pFileInfo->dwProductVersionLS); char strVersion[50];
memset(strVersion, 0, sizeof(strVersion));
sprintf(strVersion, "%d.%d.%d.%d", nVer0, nVer1, nVer2, nVer3); GlobalUnlock(hMem);
GlobalFree(hMem);
}