【问题标题】:'DLLVERSIONINFO' Compile error after updating project to VS2012 from VS2008'DLLVERSIONINFO' 将项目从 VS2008 更新到 VS2012 后编译错误
【发布时间】:2015-04-02 07:29:16
【问题描述】:

多年来,我有一个非常古老的 C++ 应用程序,在我之前,源代码已经迁移了很多次。它现在在 VS2008 下构建和编译。我决定迁移到 VS2012,这样做之后,我现在收到以下编译器错误:错误 C2371:'DLLVERSIONINFO':重新定义;不同的基本类型

我没有更改任何一行代码。我只是将项目从 VS2008 更新到 VS2012。

在访问MSDN 并玩了一点之后,我在 _DllVersionInfo 结构的最后注释掉了结构“DLLVERSIONINFO”的最后一部分。

现在项目编译并运行!!!

我的问题如下: 1)这是否意味着微软改变了这个结构在 VS2012 中的工作方式? 2)如果我永远离开评论部分,我可能会遇到什么样的问题?

源代码如下。

// 1998 Microsoft Systems Journal
//
// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
// http://www.microsoft.com/msj/0498/c0498.aspx

#ifndef __MODULEVER_H
#define __MODULEVER_H

// tell linker to link with version.lib for VerQueryValue, etc.
#pragma comment(linker, "/defaultlib:version.lib")

#ifndef DLLVERSIONINFO
// following is from shlwapi.h, in November 1997 release of the Windows SDK

typedef struct _DllVersionInfo
{
    DWORD cbSize;
    DWORD dwMajorVersion;                   // Major version
    DWORD dwMinorVersion;                   // Minor version
    DWORD dwBuildNumber;                    // Build number
    DWORD dwPlatformID;                     // DLLVER_PLATFORM_*
} /*DLLVERSIONINFO*/; // commented out this part

// Platform IDs for DLLVERSIONINFO
#define DLLVER_PLATFORM_WINDOWS         0x00000001      // Windows 95
#define DLLVER_PLATFORM_NT              0x00000002      // Windows NT

#endif // DLLVERSIONINFO

// value must pair with static LPCTSTR Keys[]  in method CString
//  CMainVersion::GetFile_VS_VERSION_INFO(...)
typedef  enum  {
    eCompanyName = 0,
    eFileDescription = 1,
    eFileVersion = 2,
    eInternalName = 3,
    eLegalCopyright = 4,
    eOriginalFilename = 5,
    eProductName = 6,
    eProductVersion = 7,
    eAllInfo = 8
} E_VS_VERSION_INFO;

class CModuleVersion : public VS_FIXEDFILEINFO 
{
protected:
 BYTE* m_pVersionInfo;  // all version info

 struct TRANSLATION {
    WORD langID;            // language ID
    WORD charset;           // character set (code page)
} m_translation;

public:
 CModuleVersion();
 virtual ~CModuleVersion();
 static CString GetModuleVersion();
 static CString GetModuleHistory();

 BOOL  GetFileVersionInfo(LPCTSTR modulename);
 CString    GetValue(LPCTSTR lpKeyName);
 static BOOL DllGetVersion(LPCTSTR modulename, DLLVERSIONINFO& dvi);
};

class CMainVersion 
{
public:
 CMainVersion();
 virtual ~CMainVersion();

static CString GetFileVersion(const CString & csModuleName);
static CString GetFile_VS_VERSION_INFO(const CString & csModuleName,
E_VS_VERSION_INFO eInfo);
static CString GetFileAndDllVersion(const CString & csModuleName);
static CString GetAllVersions();
};
#endif

【问题讨论】:

  • // 1998 Microsoft Systems Journal你为什么用17年前的头文件?其次,如果您将版本信息留在 DLL 之外,那么当您使用各种 Windows 工具和实用程序时,您将无法知道您的 DLL 是什么版本。
  • "你为什么使用 17 年前的头文件?"因为那是我得到的。可悲的是,有一些比较老。我还没有在这个项目中写过一行代码。在某些时候,所有这些应用程序都必须重新编写。我的工作是在那之前进行维护。

标签: c++ visual-studio-2012 visual-studio-2008


【解决方案1】:

显然,Microsoft 在 VS2008 和 VS2012 之间的某个时间添加了自己的 DLLVERSIONINFO 声明(在 shlwapi.h 中)。您不应该再手动声明它,只需使用 #include <shlwapi.h> 代替。

无论哪种方式,#ifndef DLLVERSIONINFO 都不会起作用,因为 DLLVERSIONINFO 没有使用 #define 语句声明。如果要根据编译器版本有条件地定义DLLVERSIONINFO,请改用_MSC_VER,例如:

#if _MSC_VER >= 1700 // 1700 == VS2012
#include <shlwapi.h>
#else
// following is from shlwapi.h, in November 1997 release of the Windows SDK

typedef struct _DllVersionInfo
{
    DWORD cbSize;
    DWORD dwMajorVersion;                   // Major version
    DWORD dwMinorVersion;                   // Minor version
    DWORD dwBuildNumber;                    // Build number
    DWORD dwPlatformID;                     // DLLVER_PLATFORM_*
} DLLVERSIONINFO;

// Platform IDs for DLLVERSIONINFO
#define DLLVER_PLATFORM_WINDOWS         0x00000001      // Windows 95
#define DLLVER_PLATFORM_NT              0x00000002      // Windows NT

#endif // _MSC_VER

【讨论】:

  • 做到了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多