

Visual StudioのC++開発において、バイナリファイルをプログラムに埋め込んでプログラムから参照する方法を探しています。

gccにおけるC及びC++開発であれば、下記のリンク先のようにバイナリファイルをプログラムに埋め込むことが可能かと思います。

データファイルをバイナリに埋め込みたい  
[http://www.ujiya.net/linux/?q=%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%9F%E3%81%84&all=1](http://www.ujiya.net/linux/?q=%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%9F%E3%81%84&all=1)

上記のようなプログラミングをVisual StudioのC++上でやるには、どのような方法があるか教えていただけますでしょうか。  
また、可能であれば簡単な使い方も含めて教えていただければと思っています。

あと調査中で調べきれていないのですが、なんとなくリソースファイルを使用するのではないかと思っているのですが認識あっていますでしょうか。


CC BY-SA 3.0
2017-04-25T09:39:02.003
34270
2017-04-26T13:54:36.517
4260
question
c++ visual-studio
Visual StudioのC++開発において、バイナリファイルをプログラムに埋め込んで参照するにはどのような方法がありますでしょうか。


すぐに思いつく方法としては、 `char data[] = { ... };`
の様なC言語のソースを生成するスクリプトを作っておいて、ビルド前にそのスクリプトを走らせ、自動生成されたソースと一緒にビルドするという方法でしょうか。

あと、ビルド済みの .exe
ファイルに、後からリソースを書き込むこともできます。`BeginUpdateResource`、`UpdateResource`、`EndUpdateResource`といったAPIが使えるか検討してみてください。


CC BY-SA 3.0
2017-04-25T14:10:27.227
34275
2017-04-25T14:10:27.227
3337
34270
answer


ソリューションエクスプローラーでプロジェクトを選択し、メニューの[Project]-[Add Resource...]を選択します。[[リソースの追加]
ダイアログ ボックス](https://msdn.microsoft.com/ja-
jp/library/5t17zahz.aspx)が表示されるので[Custom...]を選択すると[[新規カスタム リソース] ダイアログ
ボックス](https://msdn.microsoft.com/ja-
jp/library/dd31s3ky.aspx)が表示されます。リソースの種類は任意ですが`BINARY`くらいにしておくとよいでしょう。入力するとバイナリエディタが表示されますので、適当に文字を打ってから保存します（0バイトでは保存できないため）。

以上の操作を行った段階で、プロジェクトには`プロジェクト名1.rc`、`binary1.bin`、`resource.h`が追加されていて、これらをビルドする設定も完了しています。ここで`プロジェクト名1.rc`を右クリック[View
Code F7]を選択するとソースコードが表示されますが

[code]

    /////////////////////////////////////////////////////////////////////////////
    //
    // BINARY
    //
    
    IDR_BINARY1             BINARY                  "binary1.bin"
    
[/code]

とあるはずです。この記述により`binary1.bin`がリソースとして実行ファイルに格納されることを意味します。また`resource.h`には

[code]

    #define IDR_BINARY1                     101
    
[/code]

とマクロ定義されているので、このIDを使用してプログラム内からアクセスします。  
使用するAPIは[FindResource()](https://msdn.microsoft.com/en-
us/library/ms648042\(v=vs.85\).aspx)、[LoadResource()](https://msdn.microsoft.com/en-
us/library/ms648046\(v=vs.85\).aspx)、[SizeofResource()](https://msdn.microsoft.com/en-
us/library/ms648048\(v=vs.85\).aspx)です。

[code]

    auto bin = FindResourceW(nullptr, MAKEINTRESOURCEW(IDR_BINARY1), L"BINARY");
    auto ptr = LoadResource(nullptr, bin);
    auto size = SizeofResource(nullptr, bin);
    
[/code]

第１引数にはモジュールハンドルを渡す必要がありますが、実行ファイル自身の場合`nullptr`で構いません。`FindResourceW()`の第２引数は`resource.h`で定義されたマクロ値を使って指定します。第３引数は[新規カスタムリソース]ダイアログボックスで入力した値です。

以上を行うと、`ptr`変数は`binary1.bin`がメモリに読み込まれたアドレス、`size`には`binary1.bin`のサイズが得られます。


CC BY-SA 3.0
2017-04-25T14:25:09.263
34276
2017-04-26T13:54:36.517
2017-04-26T13:54:36.517
4236
4236
34270
answer