2015-04-01 2 views
0

У меня очень старое приложение на C++, которое на протяжении многих лет, и до моего времени, исходный код был перенесен много раз. Теперь он формируется и компилируется под VS2008. Я решил перейти на VS2012, после этого теперь получаю следующую ошибку компилятора: ошибка C2371: 'DLLVERSIONINFO': redefinition; разные базовые типы«DLLVERSIONINFO» Ошибка компиляции после обновления проекта до VS2012 от VS2008

Я не изменил ни одной строки кода. Я просто обновил проект от VS2008 до VS2012.

После посещения MSDN и немного поиграв, я прокомментировал последнюю часть структуры «DLLVERSIONINFO» в самом конце структуры _DllVersionInfo.

Теперь проект компилируется и запускается !!!

Мои вопросы заключаются в следующем: 1) Означает ли это, что Microsoft изменила способ работы этой структуры в 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 Systems Journal' Почему вы используете 17-летний файл в заголовок? Во-вторых, если вы оставите информацию о версии из своей DLL, вы не сможете узнать, какая версия вашей библиотеки DLL, когда вы используете различные инструменты и утилиты Windows. – PaulMcKenzie

+0

«Почему вы используете 17-летний заголовочный файл?» Потому что это то, что мне дали. Грустная вещь, есть некоторые, которые старше. Мне еще предстоит написать одну строку кода в этом проекте. В какой-то момент все эти приложения должны быть переписаны. Моя работа заключается в том, чтобы выполнять техническое обслуживание до тех пор. – MTH

ответ

1

Очевидно, что Microsoft добавила свою собственную декларацию 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