2015-04-01 56 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