ページ 12

DLLにビットマップ

Posted: 2006年3月11日(土) 20:37
by 雷電
題の通り、DLLにビットマップを格納して、プログラムAで実行するとビットマップが現れるというようなDLLを作るにはどうすればいいでしょう。
Exportを使うことも知ってますが、よくわからないので質問しました。

Re: DLLにビットマップ

Posted: 2006年3月11日(土) 23:27
by 7
> 題の通り、DLLにビットマップを格納して、プログラムAで実行するとビットマップが現れるというようなDLLを作るにはどうすればいいでしょう。
よく読んでいませんが、おりゃさんのコードの切れ端から。
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=26

Posted: 2006年3月12日(日) 11:29
by 雷電
私が思っているものより少し違います。
プログラムAは、前回投稿させてもらった、AppendMissionEditorで、そのビットマップをDLLに格納し、使用としました。説明が足りませんでした。

Posted: 2006年3月12日(日) 15:09
by 7
> 私が思っているものより少し違います。
> そのビットマップをDLLに格納し、使用としました。
???
DLLにビットマップを詰め込んで(ギフトよろしく)、プログラム側からDLLに詰めたビットマップを取り出して扱いたいと解釈してるんですが、やっぱり違いますか...?

あ。DLLにビットマップを扱う関数も詰め込みたいということですか?
でしたら、Win32プログラミング講座の「Step9. ビットマップビューワを作る」と「Step14. DLLを作る」が参考になると思います。

Posted: 2006年3月12日(日) 16:13
by 雷電
> DLLにビットマップを詰め込んで(ギフトよろしく)、プログラム側からDLLに詰めたビットマップを取り出して扱いたいと解釈してるんですが、やっぱり違いますか...?
そういうことです。が、ぜんかいとうこうしてもらったURLを見ても、よくわからなかったので、再度7様に聞こうと思っていたのです。
知識無しの私ですが、よろしくお願いします。

Posted: 2006年3月12日(日) 19:16
by 7
> そういうことです。が、ぜんかいとうこうしてもらったURLを見ても、よくわからなかったので、再度7様に聞こうと思っていたのです。
> 知識無しの私ですが、よろしくお願いします。
何がよろしくなんでしょうか...?
リンク先のプログラムが実際に動くか実験してませんので動く保障は無いのですが、一応最初に提示したリンク先は適切な解答になってますよね。

問題点を明確にしてから、よろしくお願いして下さい。

Posted: 2006年3月12日(日) 20:39
by 雷電
えっと、DLLにビットマップを格納することはできるのですが、
それから、どういう動作をするのかわからないんです。
というのは、一応完成したAPE(AppendMissionEditorの略)からアクセスする方法がわからないということです。
アクセスはAPEからでいいんですが、DLLの作成時に、コードは書かなくてもいいのでしょうか?

Posted: 2006年3月12日(日) 23:00
by 7
> 一応完成したAPE(AppendMissionEditorの略)からアクセスする方法がわからないということです。
> アクセスはAPEからでいいんですが、DLLの作成時に、コードは書かなくてもいいのでしょうか?
リンク先のコードをここにペーストして欲しいのでしょうか。
失礼ですが、しっかりとリンク先を読んでくれませんか?
DLL側にどんなコードを書くのか、DLLを呼び出すプログラム側にはサンプル的ですがどんなコードを書くのか、書かれているはずです。
AB3のコードなので問題があるかもしれませんが、問題に当たってから質問して下さい。

余計なお世話ですが、AME(Append Mission Editor)なのではないでしょうか?

Posted: 2006年3月13日(月) 14:08
by 雷電
Give up・・・
リンク先を見ているんですが、よくわかりません。
頼ってるわけではないんですが、教えていただけませんか?

Posted: 2006年3月13日(月) 15:07
by 7
> Give up・・・
白い旗上げても止まらないで...。

【DLL側】
まず、HINSTANCE型グローバル変数g_hInstanceを宣言します。

次に、DllMain()関数の中の_System_StartupProgram()関数の上の行にg_hInstance=hinstDLLを書き加えます。
で、あとはDLLのビットマップを取り出して表示したいだけなら、GetSampleBmp(),ShowBmpInWnd()関数を定義すればいいと思います。
GetSampleBmp(),ShowBmpInWnd()関数の定義はリンク先からプロジェクトにコピー&ペーストして下さい。

【呼び出しプログラム側】
呼び出し側プログラムはまずDeclare文でDLLの関数を宣言します。GetSampleBmp(),ShowBmpInWnd()関数を宣言するだけで構いません。

次に、使用目的に合わせてHBITMAP型変数hBmpをグローバルか、プロシージャ内で宣言します。
あとは、ビットマップを表示する前に、GetSampleBmp()関数でビットマップのハンドルを取得し、ShowBmpInWnd()関数で描写します。
ビットマップが要らなくなったらDeleteObject()関数で解放する必要があります。

説明が下手で分かり辛いかもしれません...。

Posted: 2006年3月13日(月) 19:03
by 雷電
すいません。
間違って、ビットマップとツールバーとを勘違いしていたようです。
話を戻しますが、ツールバーの場合も、この方法と同じなのでしょうか?

<読み込む側>
MainWnd.sbp(142) - "GetSampleBmp" はすでに定義されています
MainWnd.sbp(149) - "ShowBmpInWnd" はすでに定義されています
MainWnd.sbp(191) - "IDB_BITMAP1" 無効な識別子です
MainWnd.sbp(210) - "IDB_BITMAP2" 無効な識別子です
とエラーが出てしまいます。

Posted: 2006年3月13日(月) 20:14
by 雷電
DLLから読み込むことはできました。
次に、DLLが同じフォルダ内にない場合、メッセージを送ることもできました。
しかし、EXEもともとにあるコードを元にツールバーがない状態でも使えてしまいます。
それを防止するために、DLLがない場合、メッセージを送り、そのままプログラムを終了するにはどうすればいいですか?

Posted: 2006年3月13日(月) 20:26
by 7
> 間違って、ビットマップとツールバーとを勘違いしていたようです。
!?!?!?

> 話を戻しますが、ツールバーの場合も、この方法と同じなのでしょうか?
会話ができるか心配になってきました...。
  • 1.DLLにビットマップを詰め込んで、それを取り出してウィンドウに表示したい
    2.DLLにビットマップを詰め込んで、それを取り出してツールバーに表示したい
    3.DLLにツールバーを作る関数を詰め込んで、それを使ってツールバーを作りたい
自分は1.のつもりで回答していたのですが...不毛でしたか...。
1から3に聞きたいことは含まれますか?含まれないなら質問したいことを正確に書いて下さい。

下は自分に理解力がないんでしょうか。ちょっと失礼な書き方かもしれません。

> DLLから読み込むことはできました。
ビットマップの読み込みができたのですか?

> 次に、DLLが同じフォルダ内にない場合、メッセージを送ることもできました。
メッセージとはなんでしょうか?

> しかし、EXEもともとにあるコードを元にツールバーがない状態でも使えてしまいます。
何を使えるんでしょうか?

> それを防止するために、DLLがない場合、メッセージを送り、そのままプログラムを終了するにはどうすればいいですか?
試してないので分かりませんが、DLLが見つからない場合プログラムは起動しないと思いますよ。

Posted: 2006年3月13日(月) 20:32
by 雷電
2です。その通りにしたいのですが・・・。
ビットマップの読み込み=間違いでした・・・。
できたーーと思ったら、ビットマップを取り込んだままだった。(AMEに)
すいません。APEと書いていましたね、前に。
2番でお願いします。

Posted: 2006年3月13日(月) 23:26
by 7
> 2です。その通りにしたいのですが・・・。
ツールバーもウィンドウですからビットマップを描写すること自体は可能だとは思いますけど、素直にビットマップを同じプロジェクトのリソースに入れておいた方がいいんじゃないでしょうか。

CreateToolbarEx()関数の第6引数にはビットマップのリソースIDを指定するんですよね。ビットマップのハンドルだと勘違いしてたので面倒臭くなってきました...。
さっき書いた通りツールバーもウィンドウなので、ビットマップのないツールバーを作った後にビットマップを描写してしまう方法もありだと思いますが...。

ビットマップのリソースIDを指定する場合、LoadLibrary()関数を使う必要があるんでしょうか。
プログラム側からはDLLの中で定義されたリソースIDを指定できないので、定数名ではなく素直に数値で渡してしまえばいいんでしょうか...。
自分には分からない問題(というか調べるのが面倒)なので、他の方の回答を待つか、雷電さんご自身で調べて下さい。

ちなみに、どうしてツールバーに使うビットマップをDLLから読み込もうと思ったのでしょう?