Bạn thực sự không thể dừng trình chỉnh sửa tài nguyên dựng sẵn của Visual Studio khỏi thực hiện việc này. Bất kỳ lúc nào bạn sử dụng trình chỉnh sửa tài nguyên (tức là, GUI) để thực hiện thay đổi cho một mục trong tệp tài nguyên, nó sẽ tạo lại mã của tệp tài nguyên. Điều này sẽ ẩn tất cả các loại chỉnh thủ công được tạo thành tệp tài nguyên, bao gồm thay thế hằng số biểu tượng và/hoặc số học bằng chữ, loại bỏ các khối mã được xác định theo điều kiện, phá hủy định dạng thủ công cẩn thận, v.v. Do đó, bạn không nên chỉnh sửa thủ công tệp tài nguyên.
Nếu bạn cần có thể thực hiện chỉnh sửa thủ công đối với tệp tài nguyên mà trình chỉnh sửa tài nguyên sẽ không ghi đè, thì bạn có thể đạt được điều đó bằng cách thêm tệp tài nguyên thứ hai vào dự án của bạn. Theo quy ước, điều này có một phần mở rộng .rc2
. Trình soạn thảo tài nguyên của Visual Studio sẽ không bao giờ chỉnh sửa trực tiếp các tài nguyên này, có nghĩa là tất cả các chỉnh sửa phải được thực hiện thủ công. Nhưng một khi bạn thiết lập nó một cách chính xác, tất cả các tài nguyên bạn đặt ở đó sẽ vẫn được liên kết vào nhị phân của bạn, làm cho kết quả cuối cùng tương đương.
Đây là cách duy nhất để có được phiên bản lành mạnh và tôi sử dụng nó trong các dự án của riêng mình. Ví dụ:
//
// MyProj.RC2 - resources Microsoft Visual C++ does not edit directly
//
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#include "Version.h"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VERSION_MYPROJ_MAJOR,VERSION_MYPROJ_MINOR,VERSION_MYPROJ_REVISION,0
PRODUCTVERSION VERSION_MYPROJ_MAJOR,VERSION_MYPROJ_MINOR,VERSION_MYPROJ_REVISION,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "Cody Gray"
VALUE "FileDescription", "The World's Greatest Application"
VALUE "FileVersion", VERSION_MYPROJ_FULL
VALUE "InternalName", "MyProj"
VALUE "LegalCopyright", "Copyrights are for suckers!"
VALUE "OriginalFilename", "MyProj.exe"
VALUE "ProductName", "MyProj"
VALUE "ProductVersion", VERSION_MYPROJ_FULL
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
Bạn cũng có thể đặt các tài nguyên khác tại đây. Ví dụ, trong một ứng dụng mà tôi đang làm việc bây giờ, tôi có một tài nguyên hộp thoại mà tôi chỉ muốn được liên kết vào các bản dựng "gỡ rối" (nó là để cấu hình các tùy chọn liên quan đến nội bộ, gỡ lỗi). Tôi đã cố gắng gói định nghĩa của hộp thoại với #ifdef DEBUG
, nhưng trình soạn thảo tài nguyên đã tước toàn bộ khối đó ra mỗi khi nó chạy, vì vậy đó là một sự không đi. Thay vào đó, tôi đã chuyển định nghĩa của hộp thoại vào tệp .rc2
của mình, giữ nó trong gói #ifdef
. Tôi đã mất khả năng chỉnh sửa nó bằng trình chỉnh sửa tài nguyên nhưng tôi không quan tâm nhiều đến điều đó vì tôi có thể chỉnh sửa nhanh chóng bằng tay trong sự kiện hiếm hoi mà tôi cần thực hiện thay đổi. Và ít nhất nó không bị tước bỏ tự động.
Khóa cuối cùng là nhận tệp .rc2
này để biên soạn bởi trình chỉnh sửa tài nguyên và được liên kết vào nhị phân của bạn. Để thực hiện điều đó, bạn cần phải chỉnh sửa tệp tài nguyên chính của mình (.rc
), nhưng thay đổi này sẽ được giữ nguyên. Phần bạn muốn chỉnh sửa là các tài nguyên TEXTINCLUDE
.Trong tập tin .rc
của tôi, phần đó trông giống như sau:
/////////////////////////////////////////////////////////////////////////////
//
// 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"
"#include ""Version.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"LANGUAGE 9, 1\r\n"
"#include ""MyProj.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""AfxRes.rc"" // standard components\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
Phần quan trọng là nơi MyProj.rc2
đượC#included trong phần thứ 3 TEXTINCLUDE
. Bất kỳ văn bản ở đây được đổ trực tiếp vào tập tin tài nguyên bất cứ khi nào trình biên dịch nguồn chạy, vì vậy ở phần cuối của tập tin tài nguyên của bạn, bạn sẽ thấy một phần tự động tạo ra quen thuộc nhìn như:
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "MyProj.rc2" // non-Microsoft Visual C++ edited resources
#include "AfxRes.rc" // standard components
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
Nó gấu nhắc đến, trong trường hợp bạn không thể tìm ra cách để các mảnh với nhau từ ví dụ của tôi ở đây, rằng các mẫu dự án MFC trong Visual Studio thiết lập này tất cả cho bạn tự động, như được mô tả trong this technical note.