2013/03/20

バージョン情報の作成

Visual StudioでWin32アプリケーションを作るとき、Express版では実行ファイルのバージョン情報を作成する機能が省かれているが、これを手動で作成する方法。

1. 前置き

対象はVisual Studio Express 2012 for Windows Desktopで、Visual C++でWin32コンソールアプリケーションを選んだ場合。C#やVisual Basicの場合は標準でバージョン情報が付くので関係ない。

バージョン情報とは実行ファイルのプロパティを開いたとき「詳細」タブに表示されるもので、この有無はプログラムの実行には関係ないが、何のプログラムか分からなくなったときにその素性を知る手掛かりになる。というより、素性が不明の実行ファイルをいきなり実行するのは普通に考えて危険なので、そういう危険かもしれないファイル扱いされないためには、バージョン情報を付けておくのがベターという話。

2. 作成方法

テキストファイルをプロジェクトに追加するだけなので、そんなに難しくない。

2.1. リソーススクリプトの追加

リソーススクリプトとはバージョン情報などの情報を記述したテキストファイル。Win32コンソールアプリケーションの場合は自動的には作成されないので、追加する必要がある。この例ではプロジェクト名を「Nameless」、リソーススクリプト名を「Nameless.rc」とする。

ソリューションエクスプローラー -> リソースファイル -> 追加 -> 新しい項目 -> ユーティリティ -> テキストファイル(.txt) と進み、ファイル名を「Nameless.rc」と編集して追加。

2.2. リソーススクリプトの編集

作成されたNameless.rcのコードを表示して、以下のように編集する。
#include <windows.h>

VS_VERSION_INFO    VERSIONINFO
FILEVERSION        0,1,0,0
PRODUCTVERSION     0,1,0,0
FILEFLAGSMASK      VS_FFI_FILEFLAGSMASK
FILEFLAGS          0x0L
FILEOS             VOS_NT_WINDOWS32
FILETYPE           VFT_APP
FILESUBTYPE        VFT2_UNKNOWN
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000004b0" // Neutral language, Unicode
        BEGIN
            VALUE "CompanyName",      ""
            VALUE "FileDescription",  "Win32 console application"
            VALUE "FileVersion",      "0.1.0.0"
            VALUE "InternalName",     "Nameless.exe"
            VALUE "LegalCopyright",   "Copyright (c) 2013 Nameless man"
            VALUE "OriginalFilename", "Nameless.exe"
            VALUE "ProductName",      "Nameless application"
            VALUE "ProductVersion",   "0.1.0.0"
        END 
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0, 1200 // Neutral language, Unicode
    END
END
それぞれの意味はMSDNのページ(VERSIONINFO resource)に網羅されている。

とくに説明が必要な点としては、
  • VS_FFI_FILEFLAGSMASK、VOS_NT_WINDOWS32、VFT_APP、VFT2_UNKNOWNの部分は直接数字(Long)で指定することも可能で、その場合は冒頭のwindows.hのincludeは不要。
  • 7行目のFILEFLAGSの0x0Lはリリース版の意味。
  • 14行目の「BLOCK "000004b0"」と28行目の「VALUE "Translation", 0x0, 1200」は対の関係にあって、前者の上4桁「0000」と後者の「0x0」はlangID、前者の下4桁「04b0」と後者の「1200」はcharsetIDを示す。この例ではlangIDは指定なし、すなわちニュートラル言語で、charsetIDはUnicodeの意味。
2.3. ビルド

後はプロジェクトのビルド時にリソーススクリプトのコンパイルとリンクもVisual Studioが自動的にやってくれるので、何もなし。

この例では実行ファイルの「詳細」タブは以下のようになる。

0 コメント :