2013-07-29 2 views
2

리소스 컴파일러가 리소스 파일 (.rc)을 처리 할 수 ​​없기 때문에 미리 정의 된 매크로를 리소스 파일 (.rc)로 가져올 수 없다는 사실에 놀랐습니다.컴파일 타임에 올바른 버전 정보를 리소스에 삽입하는 방법은 무엇입니까?

나는 빌드 시스템에 의해 생성/업데이트 될 version.h 안에 버전 정보를 넣으려고했다. 이 파일은 resource.rc에 포함되어 있으므로 리소스를 빌드 할 때 항상 모든 빌드 된 파일에서 동일한 버전이 제공됩니다.

RC_INVOKED 및이 버그 http://connect.microsoft.com/VisualStudio/feedback/details/532929/rc4011-warnings-from-vc10-rc과 관련이있는 것으로 보입니다.이 디자인은 "설계 상태대로"닫힙니다.

이 문제를 어떻게 해결할 수 있습니까?

버전 정보를 업데이트하기 위해 최종 exe 파일을 패치하는 유일한 방법은 무엇입니까? ... 나는 이것을하지 않고 더 표준적인 방법으로 이것을 선호합니다.

답변

2

리소스 컴파일러는 includes 및 preprocessor 정의를 사용하면 문제가 없습니다. 예를 들어 Windows.h를 포함하는 것만으로는 충분하지 않습니다. 하지만 나는 을 생각할 수 없다. 왜이 리소스 컴파일러에 의해 소비되는 파일에서 필요한 이유 일까? 경고의 원인을 포함하지 않는 헤더 파일을 사용하고 필요한 것을 정의하십시오. 예를 들어 우리가 여기에서 사용하는 일반적인 버전이 작업을 수행하고 잘 작동 : 여기 가능성부터

#include <winver.h> 

#define stringize(x)  stringizei(x) 
#define stringizei(x)  #x 

#ifdef VRC_INCLUDE 
    #include stringize(VRC_INCLUDE) 
#endif 

#ifdef _WIN32 
    LANGUAGE 0x9,0x1 
    #pragma code_page(1252) 
#endif 

1 VERSIONINFO 
FILEVERSION VRC_FILEVERSION 
PRODUCTVERSION VRC_PRODUCTVERSION 
FILEFLAGSMASK 0x1L 
FILEFLAGS  VS_FF_DEBUG 
FILEOS   VOS__WINDOWS32 
FILETYPE  VRC_FILETYPE 
BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
    BLOCK "040904E4" 
    BEGIN 
     VALUE "CompanyName",  stringize(VRC_COMPANYNAME) 
     VALUE "FileDescription", stringize(VRC_FILEDESCRIPTION) 
     VALUE "FileVersion",  stringize(VRC_FILEVERSION) 
     VALUE "LegalCopyright", stringize(VRC_COPYRIGHT) 
     VALUE "InternalName",  stringize(VRC_ORIGINALFILENAME) 
     VALUE "OriginalFilename", stringize(VRC_ORIGINALFILENAME) 
     VALUE "ProductName",  stringize(VRC_PRODUCTNAME) 
     VALUE "ProductVersion", stringize(VRC_PRODUCTVERSION) 
    END 
    END 
    BLOCK "VarFileInfo" 
    BEGIN 
    VALUE "Translation", 0x409, 1200 
    END 
END 

거의 무제한 : 그것은 다음과 같이 보입니다로 파일 .RC 단일 마스터가있다. 모든 정의

rc /d VRC_COMPANYNAME=mycompany ... version.rc

또는 이들의 조합을

rc /d VRC_INCLUDE=$(VersionMainInclude) ... version.rc

또는 공급 : 어느 VRC_... 모든 정의를 포함하는 포함하는 파일의 전체 경로를 정의 VRC_INCLUDE.

  • 가있어 모든 프로젝트가 version.h가의 #define을 써서 짧은 VRC_FILEDESCRIPTION 및 VRC_FILEVERSION
  • 를했습니다

    여기서 나는 현재 자식과 버전이 모든 프로젝트에 대해 뭘하는지, 당신에게 가능성을 표시하려면 프로젝트가 사전 빌드 이벤트

  • 은 MSBuild의 사전 빌드 이벤트가 흥미로운 물건을 담당에 version.res를 생성하는 .targets 파일이 포함

  • VRC_COMPANYNAME/VRC_COPYRIGHT을/#define을 써서 version.h가 마스터 ... : 나는 t이, 다른 두를 결합 새 임시 헤더 파일을 만듭니다 짧은 자식 SHA와 현재의 데이터를 소요하고

    Foo Dll [12e454re 30/07/2013]

+0

자네 말이 맞아처럼 보이는 끝나는 있도록 파일의 설명 문자열에 있음을 추가, 나는 version.h가 판도라 상자를 여는 다른 .h를 포함하고 있다는 것을 놓쳤다. – sorin

관련 문제