MODULVER.CPP
上传用户:shgx688
上传日期:2009-12-27
资源大小:855k
文件大小:4k
源码类别:

SNMP编程

开发平台:

MultiPlatform

  1. ////////////////////////////////////////////////////////////////
  2. // 1998 Microsoft Systems Journal
  3. // If this code works, it was written by Paul DiLascia.
  4. // If not, I don't know who wrote it.
  5. //
  6. // CModuleVersion provides an easy way to get version info
  7. // for a module.(DLL or EXE).
  8. //
  9. #include "StdAfx.h"
  10. #include "ModulVer.h"
  11. CModuleVersion::CModuleVersion()
  12. {
  13. m_pVersionInfo = NULL; // raw version info data 
  14. }
  15. //////////////////
  16. // Destroy: delete version info
  17. //
  18. CModuleVersion::~CModuleVersion()
  19. {
  20. delete [] m_pVersionInfo;
  21. }
  22. //////////////////
  23. // Get file version info for a given module
  24. // Allocates storage for all info, fills "this" with
  25. // VS_FIXEDFILEINFO, and sets codepage.
  26. //
  27. BOOL CModuleVersion::GetFileVersionInfo(LPCTSTR modulename)
  28. {
  29. m_translation.charset = 1252; // default = ANSI code page
  30. memset((VS_FIXEDFILEINFO*)this, 0, sizeof(VS_FIXEDFILEINFO));
  31. CLoadLibrary lib(modulename);
  32. // get module handle
  33. TCHAR filename[_MAX_PATH];
  34. HMODULE hModule = ::GetModuleHandle(modulename);
  35. if (hModule==NULL && modulename!=NULL) 
  36. return FALSE;
  37. // get module file name
  38. DWORD len = GetModuleFileName(hModule, filename,
  39. sizeof(filename)/sizeof(filename[0]));
  40. if (len <= 0)
  41. return FALSE;
  42. // read file version info
  43. DWORD dwDummyHandle; // will always be set to zero
  44. len = GetFileVersionInfoSize(filename, &dwDummyHandle);
  45. if (len <= 0)
  46. return FALSE;
  47. if (m_pVersionInfo)
  48. delete m_pVersionInfo;
  49. m_pVersionInfo = new BYTE[len]; // allocate version info
  50. if (!::GetFileVersionInfo(filename, 0, len, m_pVersionInfo))
  51. return FALSE;
  52. LPVOID lpvi;
  53. UINT iLen;
  54. if (!VerQueryValue(m_pVersionInfo, _T("\"), &lpvi, &iLen))
  55. return FALSE;
  56. // copy fixed info to myself, which am derived from VS_FIXEDFILEINFO
  57. *(VS_FIXEDFILEINFO*)this = *(VS_FIXEDFILEINFO*)lpvi;
  58. // Get translation info
  59. // Note: VerQueryValue could return a value > 4, in which case
  60. // mulitple languages are supported and VerQueryValue returns an
  61. // array of langID/codepage pairs and you have to decide which to use.
  62. if (VerQueryValue(m_pVersionInfo,
  63. _T("\VarFileInfo\Translation"), &lpvi, &iLen) && iLen >= 4) {
  64. m_translation = *(TRANSLATION*)lpvi;
  65. TRACE(_T("code page = %dn"), m_translation.charset);
  66. }
  67. return dwSignature == VS_FFI_SIGNATURE;
  68. }
  69. //////////////////
  70. // Get string file info.
  71. // Key name is something like "CompanyName".
  72. // returns the value as a CString.
  73. //
  74. CString CModuleVersion::GetValue(LPCTSTR lpKeyName)
  75. {
  76. CString sVal;
  77. if (m_pVersionInfo) {
  78. // To get a string value must pass query in the form
  79. //
  80. //    "StringFileInfo<langID><codepage>keyname"
  81. //
  82. // where <lang-codepage> is the languageID concatenated with the
  83. // code page, in hex. Wow.
  84. //
  85. CString query;
  86. query.Format(_T("\StringFileInfo\%04x%04x\%s"),
  87. m_translation.langID,
  88. m_translation.charset,
  89. lpKeyName);
  90. LPCTSTR pVal;
  91. UINT iLenVal;
  92. if (VerQueryValue(m_pVersionInfo, (LPTSTR)(LPCTSTR)query,
  93. (LPVOID*)&pVal, &iLenVal)) {
  94. sVal = pVal;
  95. }
  96. }
  97. return sVal;
  98. }
  99. // typedef for DllGetVersion proc
  100. typedef HRESULT (CALLBACK* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
  101. /////////////////
  102. // Get DLL Version by calling DLL's DllGetVersion proc
  103. //
  104. BOOL CModuleVersion::DllGetVersion(LPCTSTR modulename, DLLVERSIONINFO& dvi)
  105. {
  106. CLoadLibrary lib(modulename);
  107. if (!lib)
  108. return FALSE;
  109. // Must use GetProcAddress because the DLL might not implement 
  110. // DllGetVersion. Depending upon the DLL, the lack of implementation of the 
  111. // function may be a version marker in itself.
  112. //
  113. DLLGETVERSIONPROC pDllGetVersion =
  114. (DLLGETVERSIONPROC)GetProcAddress(lib, _T("DllGetVersion"));
  115. if (!pDllGetVersion)
  116. return FALSE;
  117. memset(&dvi, 0, sizeof(dvi));  // clear
  118. dvi.cbSize = sizeof(dvi);  // set size for Windows
  119. return SUCCEEDED((*pDllGetVersion)(&dvi));
  120. }