2016-06-20 15 views
5

Tôi hiện đang làm việc trên dự án C++ VS2015 làm cho tệp thực thi.Cách dừng Visual Studio 2015 từ phiên bản mã hóa cứng

Tôi có một tệp phiên bản.h chỉ định nghĩa một loạt các số.

#define VERSION_MAJOR    3 
#define VERSION_MINOR    0 
#define VERSION_REVISION   0 
#define VERSION_BUILD    2 
#define VER_FILE_VERSION   VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD 
... 

này version.h được sử dụng trong file rc của dự án để xác định thông tin phiên bản của file thực thi.

Các tập tin rc trông giống như

#include "resource.h" 
#include "version.h" 
... 
VS_VERSION_INFO VERSIONINFO 
FILEVERSION VER_FILE_VERSION 
... 

Vì vậy, vấn đề của tôi là mỗi khi tôi thêm một nguồn tài nguyên như vậy mà resource.h được sửa đổi, Visual Studio 2015 dường như để loại bỏ các phiên bản #include ". h "trong tệp .rc và thay vào đó mã cứng tất cả các giá trị được tìm thấy trong" version.h ".

Ví dụ rc tập tin của vấn đề

#include "resource.h" 
... 
VS_VERSION_INFO VERSIONINFO 
FILEVERSION 3,0,0,2 
... 

Vì vậy, câu hỏi của tôi là, làm thế nào để ngăn chặn VS2015 từ việc này?

Trả lời

3

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.

Các vấn đề liên quan