在VC工程中添加多个RC文件(在VC2005编译通过)
在VC工程中添加多个RC文件
rc2里面的格式跟普通的rc是一样的文本格式,直接手工修改,也可以用VS打开修改.
有时需要把VC_Project2工程的资源合到VC_Project1工程的资源中(*.rc文件), 通常的做法就是用文本的方式打开VC_Project2.rc和VC_Project1.rc然后人工的判断拷贝粘贴了。
其实我们可以直接把VC_Project2.rc文件添加到VC_Project1工程中, 但此时编译可能会报下面错误
1>CVTRES : fatal error CVT1100: 重复的资源。type:VERSION, name:1, language:0x0804
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
这个错误的意思就是资源定义重复了,其实重复也很正常,因为在创建VC_Project1和VC_Project2两个工程时,很多代码都是VC自动生成的,通常这些自动生成的代码就是产生这个错误的原因了。
解决办法就是把其中一个(那肯定是后来添加进来的那一个了)(这里是VC_Project2.rc)rc文件中与工程本身的rc(这里是VC_Project1.rc)文件相同的部分删掉即可。
还要注意的是移了VC_Project2.rc文件过来, 必须要把VC_Project2工程中对应的cpp和h文件还有最重要的一个是VC_Project2工程的resource.h文件也要移到VC_Project1工程中。
例子:
具体步骤如下:
1. 分别创建了TryRC和TryRC2的基于对话框的VC工程。
并在TryRC2工程中添加了对话框 ID是IDC_DIALOG1, IDC_DIALOG1中添加了一个按钮IDC_BUTTON1, IDC_DIALOG1绑定到CDlgR类中,两个文件分别是DlgR.cpp和DlgR.h
2. 看对比TryRC.rc和TryRC2.rc文件的内容
TryRC.rc(TryRC2.rc和TryRC.rc内容基本一致,只是多了一个IDC_DIALOG1)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(中华人民共和国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.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_CHS)\r\n"
"LANGUAGE 4, 2\r\n"
"#pragma code_page(936)\r\n"
"#include ""res\\TryRC.rc2"" // 非Microsoft Visual C++ 编辑的资源\r\n"
"#include ""afxres.rc"" // 标准组件\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\TryRC.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "关于TryRC"
FONT 9, "宋体", 0, 0, 0x1
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
LTEXT "TryRC 1.0 版",IDC_STATIC,40,10,119,8,SS_NOPREFIX
LTEXT "Copyright (C) 2010",IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "确定",IDOK,178,7,50,16,WS_GROUP
END
IDD_TRYRC_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "TryRC"
FONT 9, "宋体", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "确定",IDOK,263,7,50,16
PUSHBUTTON "取消",IDCANCEL,263,25,50,16
CTEXT "TODO: 在此放置对话框控件。",IDC_STATIC,10,96,300,8
PUSHBUTTON "Button1",IDC_BUTTON1,7,7,50,14
END
/////////////////////////////////////////////////////////////////////////////
//
// 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 "080403a8"
BEGIN
VALUE "CompanyName", "TODO: <公司名>"
VALUE "FileDescription", "TODO: <文件说明>"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "TryRC.exe"
VALUE "LegalCopyright", "TODO: (C) <公司名>。保留所有权利。"
VALUE "OriginalFilename", "TryRC.exe"
VALUE "ProductName", "TODO: <产品名>"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 936
END
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 228
TOPMARGIN, 7
BOTTOMMARGIN, 48
END
IDD_TRYRC_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 313
TOPMARGIN, 7
BOTTOMMARGIN, 193
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDS_ABOUTBOX "关于TryRC(&A)..."
END
#endif // 中文(中华人民共和国) resources
/////////////////////////////////////////////////////////////////////////////
#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_CHS)
LANGUAGE 4, 2
#pragma code_page(936)
#include "res\TryRC.rc2" // 非Microsoft Visual C++ 编辑的资源
#include "afxres.rc" // 标准组件
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3. 把TryRC2工程中的TryRC2.rc, DlgR.cpp, DlgR.h和resource.h添加到TryRC工程中,由于TryRC2工程resource.h与TryRC工程resource.h同名(也要注意其他文件的同名情况),所以我把TryRC2工程resource.h改名为resource1.h(如果不把他们放在同一个目录应该就不用改名了)
4. 此时编译就会报上面说到的错误了。
所以在这里就要修改TryRC2.rc文件, 修改后的文件如下:
// Microsoft Visual C++ generated resource script.
//
#include "resource1.h" // 看这里,修改了
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(中华人民共和国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource1.h\0" // 看这里,修改了
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.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_CHS)\r\n"
"LANGUAGE 4, 2\r\n"
"#pragma code_page(936)\r\n"
"#include ""res\\TryRC2.rc2"" // 非Microsoft Visual C++ 编辑的资源\r\n"
"#include ""afxres.rc"" // 标准组件\r\n"
"#endif\r\n"
"\0"
"\r\n"
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
//-IDR_MAINFRAME ICON "res\\TryRC2.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
//-------------------------------------------------------------------------//
//-----About对话框, 这些就是与TryRC.rc重复的了---------------------------//
//IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
//STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
//CAPTION "关于TryRC2"
//FONT 9, "宋体", 0, 0, 0x1
//BEGIN
// ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
// LTEXT "TryRC2 1.0 版",IDC_STATIC,40,10,119,8,SS_NOPREFIX
// LTEXT "Copyright (C) 2010",IDC_STATIC,40,25,119,8
// DEFPUSHBUTTON "确定",IDOK,178,7,50,16,WS_GROUP
//END
//-------------------------------------------------------------------------//
//-----这个是TryRC2工程的主对话框,不包进来--------------------------------//
//IDD_TRYRC2_DIALOG DIALOGEX 0, 0, 320, 200
//STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
//EXSTYLE WS_EX_APPWINDOW
//CAPTION "TryRC2"
//FONT 9, "宋体", 0, 0, 0x1
//BEGIN
// DEFPUSHBUTTON "确定",IDOK,263,7,50,16
// PUSHBUTTON "取消",IDCANCEL,263,25,50,16
// CTEXT "TODO: 在此放置对话框控件。",IDC_STATIC,10,96,300,8
//END
//----------------------------------------------------------------------------//
IDD_DIALOG1 DIALOGEX 0, 0, 313, 142
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "确定",IDOK,61,121,50,14
PUSHBUTTON "取消",IDCANCEL,197,121,50,14
PUSHBUTTON "Button1",IDC_BUTTON1,39,46,50,14
END
/////////////////////////////////////////////////////////////////////////////
//
// 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 "080403a8"
// BEGIN
// VALUE "CompanyName", "TODO: <公司名>"
// VALUE "FileDescription", "TODO: <文件说明>"
// VALUE "FileVersion", "1.0.0.1"
// VALUE "InternalName", "TryRC2.exe"
// VALUE "LegalCopyright", "TODO: (C) <公司名>。保留所有权利。"
// VALUE "OriginalFilename", "TryRC2.exe"
// VALUE "ProductName", "TODO: <产品名>"
// VALUE "ProductVersion", "1.0.0.1"
// END
// END
// BLOCK "VarFileInfo"
// BEGIN
// VALUE "Translation", 0x804, 936
// END
//END
//-------------------------------------------------------------------------//
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
//------------------------------------------------------------//
//-----------------删掉删掉删掉------------------------------//
//IDD_ABOUTBOX, DIALOG
//BEGIN
// LEFTMARGIN, 7
// RIGHTMARGIN, 228
// TOPMARGIN, 7
// BOTTOMMARGIN, 48
//END
//IDD_TRYRC2_DIALOG, DIALOG
//BEGIN
// LEFTMARGIN, 7
// RIGHTMARGIN, 313
// TOPMARGIN, 7
// BOTTOMMARGIN, 193
//END
//------------------------------------------------------------//
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 306
TOPMARGIN, 7
BOTTOMMARGIN, 135
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
//STRINGTABLE
//BEGIN
// IDS_ABOUTBOX "关于TryRC2(&A)..."
//END
#endif // 中文(中华人民共和国) resources
/////////////////////////////////////////////////////////////////////////////
#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_CHS)
//LANGUAGE 4, 2
//#pragma code_page(936)
//#include "res\TryRC2.rc2" // 非Microsoft Visual C++ 编辑的资源
//#include "afxres.rc" // 标准组件
//#endif
// 这里有一个TryRC2.rc2暂时不清楚它有什么用
//--------------------------------------------------------------------------//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
5. 在DlgR.h中添加该语句 #include "resource1.h"
这样子包含不是很好,一修改resource1.h就要编译DlgR.h和DlgR.cpp了
暂时没有解决办法。
6. 总结:其实这样子添加多个RC文件到工程的修改和拷贝粘贴RC文件差不多, 只是在工程的结构上比较明了一点,感觉也是比拷贝粘贴RC文件好。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cay22/archive/2010/05/26/5625951.aspx