1 /* Copyright 2000, International Business Machines Corporation and others.
4 This software has been released under the terms of the IBM Public
5 License. For details, see the LICENSE file in the top-level source
6 directory or online at http://www.openafs.org/dl/license10.html
11 CModuleVersion::CModuleVersion()
16 // Destroy: delete version info
18 CModuleVersion::~CModuleVersion()
22 BOOL CModuleVersion::GetFileVersionInfo(LPCTSTR modulename,DWORD &vernum)
25 TCHAR filename[_MAX_PATH];
26 HMODULE hModule = ::GetModuleHandle(modulename);
28 if (hModule==NULL && modulename!=NULL)
30 DWORD len = GetModuleFileName(hModule, filename,
31 sizeof(filename)/sizeof(filename[0]));
34 len = GetFileVersionInfoSize(filename, &dwHandle);
38 BYTE * pVersionInfo = new BYTE[len]; // allocate version info
39 if (!::GetFileVersionInfo(filename, 0, len, pVersionInfo))
41 VS_FIXEDFILEINFO *pfixed;
43 if (!VerQueryValue(pVersionInfo, _T("\\"), (LPVOID *)&pfixed, &iLen))
45 vernum=pfixed->dwFileVersionMS;
47 return pfixed->dwSignature == VS_FFI_SIGNATURE;
50 typedef HRESULT (CALLBACK* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
52 BOOL CModuleVersion::DllGetVersion(LPCTSTR modulename, DLLVERSIONINFO& dvi,DWORD &vernum)
54 HINSTANCE hinst = LoadLibrary(modulename);
59 DLLGETVERSIONPROC pDllGetVersion =
60 (DLLGETVERSIONPROC)GetProcAddress(hinst, _T("DllGetVersion"));
65 memset(&dvi, 0, sizeof(dvi)); // clear
66 dvi.cbSize = sizeof(dvi); // set size for Windows
67 BOOL ret=SUCCEEDED((*pDllGetVersion)(&dvi));
68 vernum=MAKELONG(dvi.dwMinorVersion,dvi.dwMajorVersion);