在c++中以编程方式从DLL中获取DLL版本-再次

Getting DLL Version from within the DLL Programmatically in C++ - Again

本文关键字:DLL 获取 版本 再次 方式 c++ 编程      更新时间:2023-10-16

尝试了MSDN论坛的答案&在线程中提到的答案-我如何以编程方式获得DLL或EXE文件的版本?-但我总是得到版本号为"0.0.0.0"

右键单击我的DLL ->属性->详细信息->文件版本有正确的值。加载我的DLL的EXE没有版本信息-但不确定这是否重要。

我的代码如下(作为dll的一部分)->

   std::string moduleName     = "<full absolute path to DLL that this code is part of>";
   DWORD  zero                = 0;
   uint32 verInfoLen          = 0;
   BYTE   *verInfo            = NULL;
   VS_FIXEDFILEINFO *fileInfo = NULL;
   uint32 len                 = 0;
   /* Get the size of FileVersionInfo structure */
   verInfoLen = GetFileVersionInfoSize(moduleName.c_str(), &zero);
   if (verInfoLen == 0) {
      printf("GetFileVersionInfoSize() Failed!");
      return;
   }
   /* Get FileVersionInfo structure */
   verInfo = new BYTE[verInfoLen];
   if (!GetFileVersionInfo(moduleName.c_str(), zero, verInfoLen, verInfo)) {
      printf("GetFileVersionInfo Failed!");
      return;
   }
   /* Query for File version details. */
   if (!VerQueryValue(verInfo, "\", (LPVOID *)&fileInfo, &len)) {
      printf("VerQueryValue Failed!");
      return;
   }
   /* None of the above func calls fail - but both printf below print all zeros */
   printf("Version is %d.%d.%d.%d",
                     (fileInfo->dwProductVersionMS >> 16) & 0xff,
                     (fileInfo->dwProductVersionMS >>  0) & 0xff,
                     (fileInfo->dwProductVersionLS >> 16) & 0xff,
                     (fileInfo->dwProductVersionLS >>  0) & 0xff);
   printf("Version is %d.%d.%d.%d",
                     HIWORD(fileInfo->dwProductVersionMS),
                     LOWORD(fileInfo->dwProductVersionMS),
                     HIWORD(fileInfo->dwProductVersionLS),
                     LOWORD(fileInfo->dwProductVersionLS));

当您应该打印FileVersion字段时,您正在打印ProductVersion字段:

printf("Version is %d.%d.%d.%d",
                 HIWORD(fileInfo->dwFileVersionMS),
                 LOWORD(fileInfo->dwFileVersionMS),
                 HIWORD(fileInfo->dwFileVersionLS),
                 LOWORD(fileInfo->dwFileVersionLS));

此外,如果GetFileVersionInfo()VerQueryValue()失败,您的代码将泄漏verInfo数组。