2013-03-27 3 views
3

대상별로 몇 가지 리소스가 있습니다. 클라이언트에 대한 다른 대화 상자와 대상이 다른 대화 상자 인 관리자과 같습니다. 또한 각 대상에 고유 한 문자열도 있습니다. 클라이언트 빌드에 존재할 관리 응용 프로그램과 관련된 자원 및 코드를 원하지 않습니다.MFC에서 다른 빌드 대상에 다른 리소스 파일을 사용하는 방법

내가 3 개 리소스 파일, 관리자, 클라이언트일반적인 어떻게 든이 관리자 및 관리 빌드 일반적인 고해상도를 사용하도록 빌드 엔진을 이야기하고, 클라이언트를 사용을 할 수 있다고 가정클라이언트 빌드에 공통 res.

내가 어떻게 이것을 달성 할 수 있습니까?

어떻게 하나 이상의 리소스 파일을 가질 수 있으며 특정 대상 빌드에 리소스 파일을 사용할 수 있습니까?

답변

4

주어진 설명을 통해 다른 .RC 파일이 필요하지는 않습니다. 두 문자열 (또는 여러 대상)에 대한 문자열을 포함하는 문자열 테이블을 가질 수 있습니다. 시작시, 둘 중 하나를 가리키는 UINT 변수를 갖게됩니다. 예 :

UINT nUserConfirmationId; 
UINT nAcessDeiniedMsgId; 

if(target1) 
{ 
    nUserConfirmationId = IDD_ENG_STRING_ID_FOR_CONFIRM; 
    .. 
} 
else 
{ 
    nUserConfirmationId = IDD_FRE_STRING_ID_FOR_CONFIRM; 
    ... 
} 

그런 다음 nUserConfirmationId 변수를 사용하십시오. 비슷한 방법으로, 대화 상자 리소스를 가질 수 있습니다 (왜 다른 대화 상자가 필요한지 알 수 없으므로 문자열 만 대체해야합니다). 예, 리소스를 추가 할 때 유지 관리 문제가 있습니다.

또는 대상 전용 리소스가 포함 된 리소스 전용 DLL을 가질 수 있습니다.

+0

나는 뒤쪽으로 이것을 가지고있다. 더 나은 해결책을 찾고 있었다. 감사. – Ronnie

+0

일단 함수 포인터, 상속 등을 생각하면, 처음에는 두 번째 명령문이 있기 때문에. Methinks 당신은 충분한 세부 사항을주지 않았습니다! :) – Ajay

+0

당신의 솔루션은 런타임입니다. 빌드 시간에 작동하는 솔루션 즉 불필요한 리소스와 코드가 빌드에서 제외됩니다. 내 질문을 편집했습니다. – Ronnie

5

.rc 파일에서 #ifdef를 사용할 수 있습니다. 그러나 이것은 리소스 편집기를 망칠 것입니다. 이 문제를 다루는 '표준'방법은 각 대상에 대해 .rc 파일을 분리 한 다음 #ifdef를 수행하는 한 스크립트에서 각 파일을 # 포함하는 것입니다 (예 :

#ifdef CLIENT_1 
#include "client_1.rc" 
#endif 
#ifdef CLIENT_2 
#include "client_2.rc" 
#endif 

이렇게하면 리소스 편집기는 "완전한"rc 파일 만 구문 분석하면됩니다. 편집자가 쉽게 혼란을 느끼기 때문에 여전히 이렇게 일하는 것은 고통입니다. 이전에는 각 "대상"에 대해 별도의 프로젝트를 수행 한 다음 "리소스가 포함 된"섹션의 상대 경로를 사용하여 # 실험했습니다. 나는 왜 내가 그 접근법을 결국 사용하지 않았는지 기억하지 않는다. 전처리기를 사용하면이 작업을 수행 할 수 있지만 항상 약간 어색함을 느낍니다. 어쩌면 최신 버전의 VS로 더 잘 처리 할 수 ​​있습니다.

+0

Visual Studio 2017은 개별 리소스에 대한 조건부를 지원합니다 ... 그리고 후드 아래에서는 지정한 것처럼 #if ... #endif를 추가하지만 편집기를 손상시키지 않습니다. 내 대답에 몇 가지 자세한 내용. –

8

좋아요, 여기 당신의 질문에 완전히 답하는 것만으로도 현상금을 얻는 것이 재미있을 것입니다. (그들은 자주 MFC 태그 질문에서 그렇게하지 않습니다 :)). 귀하의 질문 중 어떤 부분이 해결되지 않았다고 생각되는지 나타내주십시오. 이것은 VS 2008의 모든 것입니다. 다른 버전의 변경 사항은 최소화되어야합니다.

  • 다른 빌드 타겟 각각에 대한 리소스 파일을 추가하는 것으로 시작하십시오. "admin.rc", "common.rc"등. 솔루션 브라우저에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 "Add-> New item-> Resource File"을 클릭하십시오.

  • 솔루션 브라우저에서 새로 추가 한 리소스 파일을 마우스 오른쪽 단추로 클릭하고 속성을 선택하고 "일반"에서 "빌드에서 제외"를 "예"로 설정하십시오.

  • 리소스보기에서 이제 필요한 리소스를 각 리소스 파일에 추가 할 수 있습니다.

  • 다음으로 리소스보기에서 "기본"리소스 파일()을 마우스 오른쪽 단추로 클릭하고 "리소스 포함"을 선택하십시오. 아래 상자에

  • , 거기에 무엇이든의 말에, 물론

#ifdef ADMIN 
#include "admin.rc" 
#endif 

에게 자신을 선택할 수있는 전처리에 사용하는 기호 및 파일 이름을 추가 리소스 파일을 더 일찍 만들 때 선택한 내용과 일치해야합니다.

  • 그런 다음, "관리자"프로젝트 구성에 (내가? 당신이 각 대상에 대해 서로 다른 구성을 사용하고 있으리라 믿고있어) 및 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 탐색을 "자원 -> 일반". "전 처리기 정의"에서 "ADMIN"(또는 이전 단계에서 선택한 항목)을 추가하십시오.

  • 솔루션을 빌드하십시오. http://www.wilsonc.demon.co.uk/d10resourceeditor.htm 또는 http://melander.dk/reseditor/과 같은 것을 사용하여 바이너리에 포함 된 리소스를 확인할 수 있습니다.

분명히 다양한 빌드에서 사용할 수없는 리소스를 고려해야합니다. 그래서 당신은 예를 들어 생성자에서 대화 IDD를 사용할 대화 상자가 표시되지 않습니다. 전처리기를 통해서도이 작업을 수행 할 수 있습니다. 각각의 구성에서 C++ 전처리기에 동일한 플래그를 추가하기 만하면됩니다.

또 다른 문제는 각각의 .rc 파일에 대해 resource.h가 있으며 각 번호는 고유 한 번호 매기기를 사용한다는 것입니다. 주의 깊게 명명하고 번호 매기기를 통해이 작업을 수행 할 수 있지만 컴파일 시간에 가능한 한 많은 문제를 잡으려고 각각 다른 범위를 할당합니다. 이렇게하려면 "resource1.h"를 열거 나 호출 한 내용을 _APS_NEXT__VALUE 정의를 더 높은 숫자로 변경하십시오.

또는 하나의 resource.h에 모든 리소스 정의를 적용하고 모든 .rc 파일을 편집하여 하나의 resource.h를 포함시킬 수 있습니다. 솔루션 탐색기에서 rc 파일을 마우스 오른쪽 버튼으로 클릭 한 다음 "open with"을 선택하고 "Source code editor"를 클릭하십시오. "복잡한 리소스 빌드"경로를 사용하는 경우 rc 파일의 형식에 익숙해 져야합니다 (기본은 최소한). 어렵지 않습니다. 링커, 리소스 컴파일러, .rc 파일, .cpp 파일 및 resource.h 파일이 서로 어떻게 관련되는지에 대한 정신적 인 그림을 얻으십시오. 게다가, MFC 고유의 전 처리기의 값은, 처음에는 협박 해 버렸지 만, 대부분은 그 자체로 설명 적입니다. 따라서, 대부분의 경우, 무시할 수 있습니다.

Petzold는 자원 파일과 형식에 대한 간결하지만 충분한 설명이 있지만, 물건을 걸러내는 동안 옷장에서 꺼내어 보관할 수 있습니다.

0

구성 관련 리소스가 몇 개 밖에없는 경우 구성간에 .rc을 공유하는 것이 더 쉽고 유지 관리가 쉬울 수도 있지만 다른 리소스 하위 집합을 사용하게하십시오. 또한 VS (2017, 적어도)에 의해 지원됩니다 : 조건을 개별 리소스에 추가하십시오.

솔루션 탐색기, 귀하의 .RC자원보기를 두 번 클릭합니다. 리소스 트리에서 구성에 종속적 인 대화 상자, 아이콘 등을 마우스 오른쪽 단추로 클릭 한 다음 속성을 엽니 다.

속성 창에서 조건을 볼 수 있습니다.

이제 클라이언트, 서버, 관리자 빌드 전용으로 사전 처리기 기호가 이미 정의되어 있어야합니다. (그렇지 않으면 않는 지금 속성 페이지! -> C/C++ -> 전 처리기 -.> 처리기 정의)

는 단순히 조건에이 기호를 추가합니다. 이 코드는 .rc 파일의 코드 블록 주위에 #ifdef ... #endif을 추가하는 효과가 있지만 VS 친화적 인 방식으로 추가됩니다. 즉, 편집기가 손상되지 않습니다.

참고 : 내가 나타났습니다하지만,하지 않는 것 이 과정이 문자열 테이블 작동하는 것이다. UI 버그인지 또는 단순히 지원되지 않는지 여부는 알 수 없습니다.

관련 문제