我有一個非常古老的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
'// 1998 Microsoft系統Journal'你爲什麼要使用一個17歲的頭文件?其次,如果將版本信息從DLL中移出,則在使用各種Windows工具和實用程序時,無法知道DLL的版本。 – PaulMcKenzie 2015-04-01 22:28:17
「你爲什麼使用17歲的頭文件?」因爲那是我得到的。可悲的是,有些更舊。我還沒有在這個項目中編寫一行代碼。在某些時候,所有這些應用程序將不得不重寫。我的工作是在那之前進行維護。 – MTH 2015-04-02 12:03:20