c++ # ifdef在资源文件中丢失

mklgxw1f  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(143)

我有一个指定对话框的资源文件。在这个对话框中,我显示应用程序的名称,版本,如果它是32位或64位版本的程序。

#ifdef WIN64
    LTEXT           "My App, Version 1.2.3.0 (64 bit)", IDC_APPLICATION_TITLE_TEXT, 42, 14, 251, 16, SS_NOPREFIX
#else
    LTEXT           "My App, Version 1.2.3.0 (32 bit)", IDC_APPLICATION_TITLE_TEXT, 42, 14, 251, 16, SS_NOPREFIX
#endif

这一切都工作得很好,直到我使用Visual Studio编辑我的任何对话框,这触发了VS保存资源文件,它剥离了我的#ifdef,只留下一个条目(32位或64位)

LTEXT           "My App, Version 1.2.3.0 (64 bit)", IDC_APPLICATION_TITLE_TEXT, 42, 14, 251, 16, SS_NOPREFIX

我的问题是,当我直接在VS中编辑对话框时,是否有办法防止VS剥离#ifdefs,或者是否有办法以可以在资源中使用的方式构造资源中使用的文本。

xlpyo6sf

xlpyo6sf1#

我知道的唯一方法是手动编辑文件,而不是使用资源编辑器。任何#define或#ifdef都会被资源编辑器处理,然后被删除,“后处理”rc是被保存的内容:-
编辑:你可以把编译器定向的资源放在你的.rc2文件中,资源编辑器不会处理它。至少它是“本地化”到你的RC 2文件中的条目的。
编辑2:这是我们的VS2019.RC文件的一个MFC DLL的例子,它利用了一个.RC2文件用于非appstudio部分。你的应该是类似的。

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#include "verrsrc.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#include ""afxres.h""\r\n"
    "#include ""verrsrc.h""\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
    "LANGUAGE 9, 1\r\n"
    "#include ""res\\Utils.rc2""  // non-Microsoft Visual C++ edited resources\r\n"
#ifndef _AFXDLL
    "#include ""afxres.rc""      // Standard components\r\n"
#endif
    "#endif\r\n"
    "\0"
END

/////////////////////////////////////////////////////////////////////////////
#endif    // APSTUDIO_INVOKED

#ifndef APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\\Utils.rc2"  // non-Microsoft Visual C++ edited resources
#ifndef _AFXDLL
#include "afxres.rc"      // Standard components
#endif
#endif

/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

注意包含.RC2文件的两段代码,一段用于RC编译器语法,另一段用于资源编辑器本身(是的,很奇怪)。

相关问题