2017-12-04 41 views
2

실행중인 응용 프로그램의 버전에 따라 리소스 파일에서 코드를 동적으로 변경할 수 있기를 원합니다. 예를 들어, about 메뉴가 있습니다. 전 메뉴 지시문에 전 처리기 지시문을 기반으로 다른 설명이 있기를 바랍니다. 내가 가진 문제는 코드를 추가 할 수 있다는 것입니다.하지만 리소스 파일을 편집하여 저장하면 .aps 파일이 내 전 처리기 지시문을 덮어 씁니다. 이 문제를 어떻게 해결할 수 있습니까? 아래의 코드는 내 리소스 스크립트에 포함시키려는 예제입니다.MFC .rc 파일의 MENU 내에서 전 처리기 지시문을 사용하는 방법은 무엇입니까?

IDR_EXAMPLE_MENU MENU 
BEGIN 

/* 


Other Menu items 

*/ 

POPUP "&Help" 
BEGIN 
    MENUITEM "&Help Topics",    ID_HELP_FINDER 
    MENUITEM SEPARATOR 
#ifdef TEST_APP 
    MENUITEM "&About TEST...",    ID_APP_ABOUT 
#else 
    MENUITEM "&About RELEASE...",    ID_APP_ABOUT 
#endif 
    END 
END 

내가 테스트 버전을 실행하고 있다면 나는 메뉴 항목에서 "TEST"를 표시하고 그 경우 릴리스 버전은 내가 같은 코드를 추가 할 수있는 방법 "릴리스 정보"표시를하고 싶은 그것을 싶습니다 .aps 파일을 .rc 파일을 저장할 때 전 처리기 지시문을 덮어 쓰지 않고도 내 리소스 파일에 저장할 수 있습니까?

편집 : This explains how files are affected by resource editing.

+0

당신은 ID_APP_ABOUTMENU' permanantly "... & RELEASE에 대해"두 개의 서로 다른 명령'MENUITEM "& TEST에 대해 ...", ID_APP_ABOUTTEST'와'MENUITEM을 가질 수와 해당 동적 중 하나를 삭제' OnUpdate' 핸들러. 매우 간단합니다. 이것이 옵션인지 알려 주시면보다 완벽한 답변을 작성하겠습니다. 그렇게하면 VS 리소스 편집기를 사용할 때 문제가되는 선처리 프로세서 명령 사용을 완전히 피할 수 있습니다. –

+0

이것은 가능한 해결책 중 하나 일 수 있습니다. 대부분의 코드 기반은 전 처리기를 사용하므로 다른 곳에서 수행되는 방식이기 때문에 그렇게 할 수 있습니다. 나는 당신이 하나를 쓰고 싶다면 완전한 답을보기를 호기심있다. – sebenalern

+0

방금 ​​A의 해결책을 받아 들였습니다. 이전 의견에서 제안한 답변에 여전히 관심이 있다면 알려 주시기 바랍니다. –

답변

1

당신은 별도의 RC 파일에 코드를 넣고 설정의 Compile-Time Directives 필드를 사용하여 포함 할 수는 대화가 포함되어 있습니다. Using Multiple Resource Files in the Same Project

리소스가 자주 변경되지 않으면 리소스 편집기에서 수정하지 않은 .rc2 파일로 리소스를 이동할 수 있습니다. 그리고 프리 프로세서를 자유롭게 사용할 수 있습니다.

다른 옵션은 여러 개의 .rc 파일을 만들거나 (예 : 원본 .rc 파일을 복사하여 나머지 파일을 제거하는 것) 리소스 컴파일러 지시문의 "Resource Includes ..> Compile-time 지시문"섹션에 조건부로 포함시키는 것입니다 .rc 파일에 저장하고 .rc 파일의 끝에서 그대로 반복합니다.

ResourcesDebug.rc처럼 두 .RC 파일을 만듭니다 :

.... 

POPUP "&Help" 
BEGIN 
    MENUITEM "&Help Topics",    ID_HELP_FINDER 
    MENUITEM SEPARATOR 
    MENUITEM "&About TEST...",    ID_APP_ABOUT 
    END 
END 

.... 

ResourcesRelease.rc : 당신은 당신의 repo에 추가 할 수 있습니다

.... 

POPUP "&Help" 
BEGIN 
    MENUITEM "&Help Topics",    ID_HELP_FINDER 
    MENUITEM SEPARATOR 
    MENUITEM "&About RELEASE...",    ID_APP_ABOUT 
    END 
END 

.... 

예를 들어

프로젝트에 추가 할 필요는 없습니다. 그러나 프로젝트에 추가하면 컴파일에서 제외해야합니다.

컴파일 시간 지침 (자원보기>를 마우스 오른쪽 버튼으로 클릭 .RC) :

#define _AFX_NO_SPLITTER_RESOURCES 
#define _AFX_NO_OLE_RESOURCES 
#define _AFX_NO_TRACKER_RESOURCES 
#define _AFX_NO_PROPERTY_RESOURCES 

#include "res\TestApp.rc2" // non-Microsoft Visual C++ edited resources 

#ifdef TEST_APP 
    #include ResourcesDebug.rc 
#else 
    #include ResourcesRelease.rc 
#endif 

.... 

좀 더 링크 :

+0

하지만 새 리소스 파일을 편집해야하고 저장하면 선행 처리기 지시문을 제거하여 덮어 씁니다. 전처리 지시문을 저장할 때 덮어 쓰지 않는 경우 동일한 .rc 파일에 전처리 지시문을 넣는 것이 좋습니다. 어쩌면 나는 너를 완전히 이해하지 못한다. 당신은 정교 할 수 있습니까? – sebenalern

+0

이것은 효과가 있습니다. 나는 내가 바꾸고 싶지 않은 모든 것을 .rc2 파일에 넣는 것을 끝내었다. – sebenalern

+0

작동하지만 유지 관리가 쉽지 않습니다. 전체 Visual Studio Resource Editor는 단지 코드의 한 부분 일뿐입니다. @xMRi 솔루션은 흥미로운 것으로 들리지만 결코 시도하지 않았습니다. –

1

당신이 원하는 VS의 리소스 편집기를 사용할 수 있지만 생성 방법 만 알고 있습니다. e 1 종류의 .rc 출력. #define 값이 없어도됩니다. 당신은 두 가지 방법 모두 가질 수 없습니다. 컴파일러 지시문을 사용하고 직접 .rc (또는 .rc2) 파일을 편집하거나 VS의 출력을 승인 할 수 있습니다.

리소스 편집기를 사용하여 VS에서 파일을 편집 한 다음 .RC의 일반 내용을 이해하고 "원하는"후 처리 프로그램을 작성할 수 있습니다.RC는 원시 내용을 컴파일러 지시문으로 대체합니다. 그것은 할 수 있지만 트레이드 오프는 응용 프로그램에 따라 다릅니다.

+0

또 다른 두 가지 (그러나 비슷한) 메뉴 리소스 (IDR_EXAMPLE_TEST_MENU 및 IDR_EXAMPLE_RELEASE_MENU)를 소스 코드에 사용하면 컴파일러 지시문을 사용하여 IDR_EXAMPLE_TEST_MENU xor를 활용할 수 있습니다. IDR_EXAMPLE_RELEASE_MENU – franji1

3

리소스 파일 내에 e 메뉴와 같은 하나의 리소스를 두 번 사용할 수도 있습니다.

각 리소스의 속성에는 조건이있을 수 있습니다. 또한 리소스에 같은 이름의 리소스를 두 번 사용할 수 있습니다.

enter image description here

당신은 첫 번째 자원에 조건 _DEBUG를 추가 할 수 있습니다. 그냥 복사하고 _RELEASE 조건을 부여하십시오. 같은 이드로 다시 이름을 변경하십시오.

enter image description here

+1

좋아요. 여기에 실제 작업에 대한 MSDN 포럼의 게시물이 있습니다 - [리소스 포함을위한 전처리 지시어] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/277177d0-0a25-4254-b58f- 5aa454deecd3/preprocessor-directive-for-resource-inclusion? forum = vcgeneral) –