Трудность в создании VersionInfo для существующего C++ DLL проекта
У меня есть существующая C++ DLL, которая правильно компилируется, но не имеет информации о версии, связанной с ней, например вкладка "Версия" в окне "Свойства" для скомпилированной библиотеки. Странно то, что у него есть файл.rc в Visual Studio, который связан с проектом и, кажется, правильно определен. Тем не менее, используется ли этот файл или заменяется на него значениями из таких мест, как Добавление файла ресурсов в dll VC6, Ресурс версии в DLL, невидимый при щелчке правой кнопкой мыши, или http://www.codeproject.com/KB/DLL/XDllPt3.aspx, я до сих пор не могу получить его для экспорта информации DLL. Я не могу опубликовать большую часть кода проекта, поскольку он является внутренним, но это содержимое файла.rc: // Сценарий сгенерированного ресурса Microsoft Developer Studio. //
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904B0"
BEGIN
VALUE "CompanyName", "\0"
VALUE "FileDescription", "PTU DLL library\0"
VALUE "FileVersion", "1, 0, 0, 1\0"
VALUE "InternalName", "PTUDLL32\0"
VALUE "LegalCopyright", "Copyright (C) 1999\0"
VALUE "ProductName", "PTU DLL library\0"
VALUE "ProductVersion", "1, 0, 0, 1\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
2 ответа
На самом деле мой вопрос был о получении информации о версии. Но на самом деле проблема решилась сама собой. Очевидно, что файл ресурсов, поставляемый с проектом, был поврежден. Создание нового, присоединение его к проекту и перемещение по информации служили для его работы. Спасибо.
Чтобы получить информацию о версии из файла, вам нужно использовать GetFileVersionInfo(). Вы должны сделать дополнительный шаг определения размера информации о версии, хранящейся перед ее извлечением с помощью вызова GetFileVersionInfoSize().
bool GetVersionInfo(const char *filename, int &major, int &minor)
{
DWORD verBufferSize;
char verBuffer[2048];
// Get the size of the version info block in the file
verBufferSize = GetFileVersionInfoSize(filename, NULL);
if(verBufferSize > 0 && verBufferSize <= sizeof(verBuffer))
{
// get the version block from the file
if(TRUE == GetFileVersionInfo(filename, NULL, verBufferSize, verBuffer))
{
UINT length;
VS_FIXEDFILEINFO *verInfo = NULL;
// Query the value
if(TRUE == VerQueryValue(verBuffer, "\\", reinterpret_cast<LPVOID*>(&verInfo), &length))
{
// Pull the version values. You can alternatively
// get the version of the file from dwFileVersionMS
// and dwFileVersionLS if necessary.
major = verInfo->dwProductVersionMS;
minor = verInfo->dwProductVersionLS;
return true;
}
}
}
return false;
}