• ベストアンサー

EXE/DLLに埋め込まれた画像

よくフリーソフトなどでEXE/DLL等に埋め込まれた画像を取り出すツールというものを見かけるのですが,そのツールを作るにはどのようにすればよいのでしょうか? また,モジュールに埋め込まれた画像を同じサイズの画像となら置き換える事ができる気もするのですが可能なのでしょうか?教えてください。 開発はVB6.0で行い処理の対象となるモジュールもVB6.0で作成されたものを想定しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

まず、どうやって埋め込んでるかは理解してますか? まずそこからですよね。 それがわかれば自分で調べられると思いますが。 で、埋め込みの方法は、リソースというものを使っています。VBでも作成可能です。 http://www.galliver.co.jp/writing/susume_vb/tre908/ 取得は 自分自身のリソース以外はVBだけでは出来ないのでLoadResource()、FindResource()などのAPIを使用する必要があります。 リソースの更新はUpdateResource()で可能ですが、9x系では動きません。 >また,モジュールに埋め込まれた画像を同じサイズの画像となら置き換える事ができる気もするのですが可能なのでしょうか?教えてください。 そういう単純な置き換えならこの方法でも可能だと思いますが、サイズといっても、もちろんファイルサイズが同じって意味ですよね?

tonytonychopper
質問者

補足

回答ありがとうございました。 さっそく以下のソースで試してみたのですが,FindResourceからの戻り値が取得できません。 なぜでしょう? "XXXXX.exe"はりソースエディタを使い,ビットマップにID"101"を設定しコンパイルしたモジュールです。 定数 RT_BITMAP = 2& はこのように定義しています。 Dim hRsrc As Long ' リソースハンドル Dim hInstance As Long ' インスタンスハンドル hInstance = LoadLibrary("XXXXX.exe") hRsrc = FindResource(hInstance , "101", RT_BITMAP) FreeLibrary(lnghInstance) --------- 置き換える画像は同じサイズという意味です(^^)

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>"XXXXX.exe"はりソースエディタを使い,ビットマップにID"101"を設定しコンパイルしたモジュールです。 "101"ではなく101ではありませんか? また、FindResourceのDeclare文が以下のようになっていませんか? Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As String, ByVal lpType As String) As Long このAPIの第2引数と第3引数は文字列を要求しますが、上位16bitが0の32bit整数を受け取ることもあります。 >定数 RT_BITMAP = 2& はこのように定義しています。 これも数値ですよね。 ということで、 Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As Long, ByVal lpType As Long) As Long とし、 hRsrc = FindResource(hInstance, 101, RT_BITMAP) と、すれば取得できるはずです。

tonytonychopper
質問者

お礼

お礼が遅くなって申し訳ございません。 ご指摘のとおりFindResourceの定義を変更すれば値を取得することができました。 ありがとうございました。