2016-06-20 2 views
5

현재 실행 파일을 만드는 C++ VS2015 프로젝트에서 작업 중입니다.하드 코딩 버전 지정에서 Visual Studio 2015를 중지하는 방법

나는 숫자 묶음을 정의하는 파일 version.h을 가지고 있습니다.

#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 
... 

version.h가이 실행 파일의 버전 정보를 정의하는 프로젝트의 .rc 파일에 사용됩니다.

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

그래서 내 문제는 때마다 내가 및 Resource.h이 수정되도록 리소스를 추가하는 것이처럼

할 때 .rc 파일이 보인다, 비주얼 스튜디오 2015은 #INCLUDE "버전을 제거하는 것 같다. h "를 사용하고 대신"version.h "에있는 모든 값을 하드 코딩합니다.

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

문제

예 .RC 파일 그래서 내 질문에, 어떻게이 일에서 VS2015을 중지합니까입니까?

답변

3

실제로 Visual Studio의 기본 제공 리소스 편집기를 중지 할 수 없습니다. 리소스 편집기 (, 즉, GUI)를 사용하여 리소스 파일의 항목을 변경하면 리소스 파일의 코드가 다시 생성됩니다. 이렇게하면 리소스 파일을 수동으로 수정하거나 기호 상수를 리터럴로 대체하거나, 조건부로 정의 된 코드 블록을 제거하거나,주의 깊게 수동 서식을 파기하는 등의 모든 수동 수정 작업을 수행 할 수 있습니다. 따라서 리소스 파일을 수동으로 편집하는 것은 좋지 않습니다.

리소스 편집기가 불필요한 리소스 파일을 수동으로 편집 할 수 있어야한다면 프로젝트에 두 번째 리소스 파일을 추가하여이를 수행 할 수 있습니다. 관례 상이 확장자는 .rc2입니다. Visual Studio의 리소스 편집기는 이러한 리소스를 직접 편집하지 않으므로 모든 편집을 수동으로 수행해야합니다. 하지만 일단 올바르게 설정하면 거기에 놓인 모든 리소스가 여전히 바이너리에 연결되어 최종 결과가 동일하게됩니다.

이것은 제정신 버전 관리를 얻는 유일한 방법이며 내 프로젝트에서 사용합니다. 예 :

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

다른 리소스도 여기에 입력 할 수 있습니다. 예를 들어, 지금 일하고있는 한 응용 프로그램에서 "디버그"빌드 (내부 디버깅 관련 옵션을 구성하기위한 것임)에 연결하기를 원하는 대화 상자 리소스가 있습니다. 대화 상자의 정의를 #ifdef DEBUG으로 감싸려고했지만 리소스 편집기가 실행될 때마다 전체 블록을 제거 했으므로 아무 작업도 수행하지 않았습니다. 대신 대화 상자의 정의를 내 .rc2 파일로 이동하여 #ifdef에 랩핑 된 상태로 유지했습니다. 나는 리소스 에디터로 편집 할 수있는 능력을 잃어 버렸지 만, 나는 드문 경우에 손으로 빠르게 편집 할 수 있기 때문에 그것에 대해별로 신경 쓰지 않는다. 적어도 자동으로 제거되지는 않습니다.

.rc2 파일을 리소스 편집기에서 컴파일하고 이진 파일에 링크하는 것이 가장 중요합니다. 이를 수행하려면 주 리소스 파일 (.rc)을 편집해야하지만이 변경 사항은 유지됩니다. 수정하려는 부분은 TEXTINCLUDE 개의 리소스입니다.내 .rc 파일에서 해당 섹션은 다음과 같은 : MyProj.rc2이 3 TEXTINCLUDE 부분에 #include하는 위치를

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

중요한 부분입니다.

#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 

그것은 언급 곰 : 리소스 파일의 끝에서, 당신은 익숙한 보이는 자동으로 생성 된 섹션처럼 볼 수 있도록 텍스트는 여기에 직접 리소스 컴파일러가 실행될 때마다 리소스 파일로 덤프됩니다 만약 당신이 여기에 예제를 함께 모으는 방법을 알아낼 수 없다면, Visual Studio의 MFC 프로젝트 템플릿은 this technical note에 설명 된대로 자동으로이 모든 것을 설정합니다.

관련 문제