我有一个现存的C ++ DLL,它可以正确编译,但没有与之关联的版本信息,例如编译库的Properties中的Version选项卡。奇怪的是它在Visual Studio中有一个与项目相关的.rc文件,似乎是正确定义的.rc文件。但是,无论是使用该文件,还是将其替换为Adding resource file to VC6 dll,Version resource in DLL not visible with right-click或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
/////////////////////////////////////////////////////////////////////////////
答案 0 :(得分:0)
其实我的问题是如何获取版本信息。但事实上,问题已经解决了。显然,项目附带的资源文件已损坏。创建一个新的,将其附加到项目,并移动所提供的信息以使其工作。谢谢。
答案 1 :(得分:-1)
要从文件中检索版本信息,您需要使用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;
}