2016-06-20 8 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ファイルで使用されています。

.rcファイルは、だから私の問題は、私はRESOURCE.Hが変更されるようにリソースを追加するたびに、Visual Studioの2015はの#include「バージョンを削除するようだということです

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

のように見えます。 h "を.rcファイルに置き、代わりに" version.h "にあるすべての値をハードコードします。

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

問題

例.RCファイルだから私の質問、どのように私はこれをやってからVS2015を止めるんですか?

答えて

3

Visual Studioのビルトインリソースエディタを実際に停止することはできません。リソースエディタ(、すなわち、GUI)を使用してリソースファイル内の項目を変更すると、リソースファイルのコードが再生成されます。これにより、シンボルファイルやリテラルの代入、条件付きで定義されたコードブロックの削除、慎重な手動書式の破棄など、リソースファイルに手動で行われるあらゆる手直しが行われます。そのため、リソースファイルを手動で編集することはお勧めしません。

リソースエディタが邪魔にならないリソースファイルを手動で編集できるようにする必要がある場合は、2番目のリソースファイルをプロジェクトに追加することで達成できます。慣例により、これは.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 

他のリソースもここに入れることができます。たとえば、私が今作業している1つのアプリケーションでは、「デバッグ」ビルド(内部、デバッグ関連のオプションの設定用)にのみリンクしたいダイアログボックスリソースがあります。私は#ifdef DEBUGでダイアログボックスの定義をラップしようとしましたが、リソースエディタは実行されるたびにそのブロック全体を取り除きました。代わりに、ダイアログボックスの定義を.rc2ファイルに移動し、#ifdefにラップさせたままにしました。私はリソースエディタでそれを編集する能力を失ったが、私は変更を行う必要があるまれなイベントで手で簡単に編集できるので、それについてはあまり気にしない。少なくとも、自動的には削除されません。

最終的なキーは、この.rc2ファイルをリソースエディタでコンパイルし、バイナリにリンクさせることです。これを行うには、メインリソースファイル(.rc)を編集する必要がありますが、この変更は保持されます。編集する部分はTEXTINCLUDEのリソースです。私の.rcファイルでは、そのセクションは次のようになります。MyProj.rc2は第三TEXTINCLUDEセクションにインクルードされた場合

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

それは言及クマ、:ここでの任意のテキストは、リソース・ファイルの最後に、あなたのような見慣れた自動生成されたセクションが表示されますので、いつでもリソースコンパイラの実行リソースファイルに直接ダンプされますこの例をここでの例と一緒にまとめる方法がわからない場合は、this technical noteで説明されているように、Visual StudioのMFCプロジェクトテンプレートによって自動的にすべてが設定されます。

関連する問題