« 吉里吉里Z β7 バイナリ | メイン | エンジン設定ツール »

2013年12月14日

吉里吉里Z 開発:: エンジン設定用リソース

    

吉里吉里2 では、本体は TVPGetCommandDesc で得られる "|" 区切り(他の区切り文字もあり)の文字列を得て、それを元にエンジン設定の項目を表示していた。
また、プラグインでは、コメント部に --has-option-- を入れて、GetOptionDesc 関数を公開し、その中で本体と同じ文字列フォーマットで設定の詳細を入れていた。
リンカに /COMMENT: で --has-option-- を追加していたが、最近の Visual Studio では無視されるので、通常の方法ではこれを DLL バイナリに入れることは出来ない。

吉里吉里Z では、設定項目のリストは JSON にし、ソースに埋め込むのではなくリソースに入れる方法に変更した。
JSON の具体的なフォーマットは、ファイルを見ればだいたい分かるはず。
本体の方はリソースの option_desc_ja.json を編集してもらえば反映されるのでいいとして、プラグイン側は少し注意が必要。
リソースの種類は、TEXT で、ID は文字列 IDR_OPTION_DESC_JSON で DLL に格納する。

具体的には *.rc ファイルに、以下のように記述してリソースに追加する。
IDR_OPTION_DESC_JSON TEXT "option_desc_ja.json"

resource.h では、IDR_OPTION_DESC_JSON を定義しない
IDR_OPTION_DESC_JSON を定義するとリソース ID が数値で追加される。

数値になっているか文字列になっているかは重要で、FindResource が失敗してしばらく悩んだ。
数値の場合は、MAKEINTRESOURCE(IDR_OPTION_DESC_JSON) 等としてリソースを指定するが、文字列の場合は、TEXT("IDR_OPTION_DESC_JSON") 等して文字列で検索する。
MAKEINTRESOURCE は、単純に数値をアドレスとして返しているだけで、上位 16 ビットが 0 になるかどうかで文字列か数値かを判定している模様。
数値で登録されているのに文字列で検索したり、文字列で登録されているのに数値で検索すると FindResource は失敗する。
Visual Studio 上から追加すると、resource.h に define が追加され、数値となる。
ID のところで "IDR_OPTION_DESC_JSON" と入力すると "\"IDR_OPTION_DESC_JSON\"" とダブルクォーテーション付きの ID となる。
当然、" も含んだ文字列でないと検索でヒットしなくなる。
つまり、Visual Studio 上から追加した場合は、MAKEINTRESOURCE(RESOURCE_ID) で検索されることを想定している。
数値で登録されている場合、数値を指定して検索すればヒットするので、共通の数値を使ってもいいが、文字列の方が複数 DLL で統一しやすいだろうことから文字列とした。



投稿者 Takenori : 2013年12月14日 03:38




comments powered by Disqus
Total : Today : Yesterday : なかのひと