winnt-win2000-win98-afs-client-updates-20010623
[openafs.git] / src / WINNT / win9xpanel / modver.cpp
1 /* Copyright 2000, International Business Machines Corporation and others.
2         All Rights Reserved.
3  
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
7 */
8 #include "StdAfx.h"
9 #include "ModVer.h"
10
11 CModuleVersion::CModuleVersion()
12 {
13 }
14
15 //////////////////
16 // Destroy: delete version info
17 //
18 CModuleVersion::~CModuleVersion()
19 {
20 }
21
22 BOOL CModuleVersion::GetFileVersionInfo(LPCTSTR modulename,DWORD &vernum)
23 {
24         vernum=0;
25    TCHAR filename[_MAX_PATH];
26    HMODULE hModule = ::GetModuleHandle(modulename);
27    DWORD dwHandle; 
28    if (hModule==NULL && modulename!=NULL)
29       return FALSE;
30    DWORD len = GetModuleFileName(hModule, filename,
31       sizeof(filename)/sizeof(filename[0]));
32    if (len <= 0)
33       return FALSE;
34    len = GetFileVersionInfoSize(filename, &dwHandle);
35    if (len <= 0)
36       return FALSE;
37
38    BYTE * pVersionInfo = new BYTE[len]; // allocate version info
39    if (!::GetFileVersionInfo(filename, 0, len, pVersionInfo))
40       return FALSE;
41    VS_FIXEDFILEINFO *pfixed;
42    UINT iLen;
43    if (!VerQueryValue(pVersionInfo, _T("\\"), (LPVOID *)&pfixed, &iLen))
44       return FALSE;
45         vernum=pfixed->dwFileVersionMS;
46         delete pVersionInfo;
47    return pfixed->dwSignature == VS_FFI_SIGNATURE;
48 }
49
50 typedef HRESULT (CALLBACK* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
51
52 BOOL CModuleVersion::DllGetVersion(LPCTSTR modulename, DLLVERSIONINFO& dvi,DWORD &vernum)
53 {
54    HINSTANCE hinst = LoadLibrary(modulename);
55         vernum=0;
56    if (!hinst)
57       return FALSE;
58
59    DLLGETVERSIONPROC pDllGetVersion =
60       (DLLGETVERSIONPROC)GetProcAddress(hinst, _T("DllGetVersion"));
61
62    if (!pDllGetVersion)
63       return FALSE;
64
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);
69         return ret;
70 }