質問: Visual StudioのC++開発において、バイナリファイルをプログラムに埋め込んでプログラムから参照する方法を探しています。 gccにおけるC及びC++開発であれば、下記のリンク先のようにバイナリファイルをプログラムに埋め込むことが可能かと思います。 データファイルをバイナリに埋め込みたい 上記のようなプログラミングをVisual StudioのC++上でやるには、どのような方法があるか教えていただけますでしょうか。 また、可能であれば簡単な使い方も含めて教えていただければと思っています。 あと調査中で調べきれていないのですが、なんとなくリソースファイルを使用するのではないかと思っているのですが認識あっていますでしょうか。
回答: ソリューションエクスプローラーでプロジェクトを選択し、メニューのProject]-[Add Resource...]を選択します。[[リソースの追加] ダイアログ ボックスが表示されるのでCustom...]を選択すると[[新規カスタム リソース] ダイアログ ボックスが表示されます。リソースの種類は任意ですが`BINARY`くらいにしておくとよいでしょう。入力するとバイナリエディタが表示されますので、適当に文字を打ってから保存します(0バイトでは保存できないため)。 以上の操作を行った段階で、プロジェクトには`プロジェクト名1.rc`、`binary1.bin`、`resource.h`が追加されていて、これらをビルドする設定も完了しています。ここで`プロジェクト名1.rc`を右クリック[View Code F7]を選択するとソースコードが表示されますが ``` ///////////////////////////////////////////////////////////////////////////// // // BINARY // IDR_BINARY1 BINARY "binary1.bin" ``` とあるはずです。この記述により`binary1.bin`がリソースとして実行ファイルに格納されることを意味します。また`resource.h`には ``` #define IDR_BINARY1 101 ``` とマクロ定義されているので、このIDを使用してプログラム内からアクセスします。 使用するAPIはFindResource().aspx)、LoadResource().aspx)、SizeofResource().aspx)です。 ``` auto bin = FindResourceW(nullptr, MAKEINTRESOURCEW(IDR_BINARY1), L"BINARY"); auto ptr = LoadResource(nullptr, bin); auto size = SizeofResource(nullptr, bin); ``` 第1引数にはモジュールハンドルを渡す必要がありますが、実行ファイル自身の場合`nullptr`で構いません。`FindResourceW()`の第2引数は`resource.h`で定義されたマクロ値を使って指定します。第3引数は[新規カスタムリソース]ダイアログボックスで入力した値です。 以上を行うと、`ptr`変数は`binary1.bin`がメモリに読み込まれたアドレス、`size`には`binary1.bin`のサイズが得られます。