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