如果我不使用 MFC,是不是需要 afxres.h?如何从 .RC 脚本中删除它?

Posted

技术标签:

【中文标题】如果我不使用 MFC,是不是需要 afxres.h?如何从 .RC 脚本中删除它?【英文标题】:Do I need afxres.h, if I am not using MFC? How do I remove it from the .RC script?如果我不使用 MFC,是否需要 afxres.h?如何从 .RC 脚本中删除它? 【发布时间】:2009-10-15 22:51:38 【问题描述】:

我不知道 RC 脚本。

我想将产品版本、文件版本等元数据包含到我正在构建的 DLL 中。我正在使用 .rc 文件来执行此操作。构建是 makefile 驱动的。我正在关注我找到的一个示例 .rc 脚本。

模板 .rc 文件包括 afxres.h ,但我认为我不需要它。但是如果我只是删除它,我会得到一堆编译错误。

基本的非 MFC RC 脚本是什么样的?我可以删除所有这样的东西吗:

/////////////////////////////////////////////////////////////////////////////
// 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

....

【问题讨论】:

【参考方案1】:

我在尝试不使用 MFC 进行编译时遇到了类似的问题。 Cheeso 的解决方案不适合我。

一切编译正常,在构建过程中我没有看到任何错误/警告。在我的资源文件中定义的图标在“Windows 资源管理器”中正确显示。但是,版本数据不可用。 (右键单击可执行文件和选择属性时可以看到。在这种情况下,不存在“版本”选项卡。)

为了让它工作,我必须在 .rc 文件的顶部添加以下包含:

#include <windows.h>

通过此更改,版本选项卡将显示在可执行文件的属性中。此外,.NET System.Diagnostics.FileVersionInfo 类现在能够获取版本信息,而这在以前是行不通的。

默认情况下,“stdafx.h”将包含“windows.h”。我不确定为什么需要 windows.h,但它似乎对我的情况有所不同。

编辑:添加了一些更具体的信息,以回应 Cheeso。

【讨论】:

你是说 rc.exe 无法编译 rc 脚本,没有包含的文件?什么符号没有定义?它是如何失败的? 这应该是公认的答案,就像魅力一样。谢谢!【参考方案2】:

我的回答: 不,我不需要那些废话。这是一个适用于 VERSIONINFO 的 RC 脚本。

#define VER_FILEVERSION          1,2,3,4
#define VER_FILEVERSION_STR      "1.2.3.4"
#define VER_PRODUCTVERSION       1,2,0,0
#define VER_PRODUCTVERSION_STR   "1.2.0.0"

// -------------------------------------------------------

VS_VERSION_INFO VERSIONINFO
 FILEVERSION            VER_FILEVERSION
 PRODUCTVERSION         VER_PRODUCTVERSION
 FILEFLAGSMASK 0x17L
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x2L
 FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
    BLOCK "040904b0"
    BEGIN
    VALUE "CompanyName",      "Company X"
    VALUE "FileDescription",  "Description Goes Here"
    VALUE "InternalName",     "NotSure"
    VALUE "LegalCopyright",   "Copyright (C) 2009 Your Name Here"
    VALUE "OriginalFilename", "DllName.dll"
    VALUE "ProductName",      "Product Title"
    VALUE "FileVersion",      VER_FILEVERSION_STR
    VALUE "ProductVersion",   VER_PRODUCTVERSION_STR
    END
END
BLOCK "VarFileInfo"
BEGIN
    VALUE "Translation", 0x409, 1200
END
END

编译成:

$(WindowsSDK)\bin\RC.exe /FoProjectName.res ProjectName.rc

【讨论】:

您可以随意编辑资源文件。单独保留您删除的行的好处是能够使用资源编辑器自动对其进行编辑。如果仔细观察,您会发现在重新生成文件时,对 afxres.h 的第二个引用会重建第一个引用。因此,用 windows.h 替换对 afxres.h 的两个引用(因为您没有使用 MFC),问题将得到解决。【参考方案3】:

我在 VS2019 中升级 RBTray 项目时遇到了同样的错误。

afxres.h改成winres.h后(如VS2019 WinApp示例项目.rc文件中),编译成功。

【讨论】:

以上是关于如果我不使用 MFC,是不是需要 afxres.h?如何从 .RC 脚本中删除它?的主要内容,如果未能解决你的问题,请参考以下文章

VS2017的文件版本

创建MFC时出现这个错误,怎么解决?

c_cpp 无法打开包含文件'afxres.h'

如果任何列中都不需要图像/图标,MFC CListCtrl 是不是合适?

使用 MFC 类编写的应用程序是不是需要安装外部框架

避免 MFC LOC DLL