2015-04-01 123 views
0

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

我没有改变一行代码。我只是将项目从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 
+0

'// 1998 Microsoft系统Journal'你为什么要使用一个17岁的头文件?其次,如果将版本信息从DLL中移出,则在使用各种Windows工具和实用程序时,无法知道DLL的版本。 – PaulMcKenzie 2015-04-01 22:28:17

+0

“你为什么使用17岁的头文件?”因为那是我得到的。可悲的是,有些更旧。我还没有在这个项目中编写一行代码。在某些时候,所有这些应用程序将不得不重写。我的工作是在那之前进行维护。 – MTH 2015-04-02 12:03:20

回答

1

很明显,微软加入了自己的DLLVERSIONINFO声明(在shlwapi.h)有时VS2008和VS2012之间。您不应该手动声明它,只需使用#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 
+0

这样做!非常感谢你! – MTH 2015-04-02 18:24:11