DLLにビットマップ
DLLにビットマップ
題の通り、DLLにビットマップを格納して、プログラムAで実行するとビットマップが現れるというようなDLLを作るにはどうすればいいでしょう。
Exportを使うことも知ってますが、よくわからないので質問しました。
Exportを使うことも知ってますが、よくわからないので質問しました。
Re: DLLにビットマップ
> 題の通り、DLLにビットマップを格納して、プログラムAで実行するとビットマップが現れるというようなDLLを作るにはどうすればいいでしょう。
よく読んでいませんが、おりゃさんのコードの切れ端から。
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=26
よく読んでいませんが、おりゃさんのコードの切れ端から。
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=26
> 私が思っているものより少し違います。
> そのビットマップをDLLに格納し、使用としました。
???
DLLにビットマップを詰め込んで(ギフトよろしく)、プログラム側からDLLに詰めたビットマップを取り出して扱いたいと解釈してるんですが、やっぱり違いますか...?
あ。DLLにビットマップを扱う関数も詰め込みたいということですか?
でしたら、Win32プログラミング講座の「Step9. ビットマップビューワを作る」と「Step14. DLLを作る」が参考になると思います。
> そのビットマップをDLLに格納し、使用としました。
???
DLLにビットマップを詰め込んで(ギフトよろしく)、プログラム側からDLLに詰めたビットマップを取り出して扱いたいと解釈してるんですが、やっぱり違いますか...?
あ。DLLにビットマップを扱う関数も詰め込みたいということですか?
でしたら、Win32プログラミング講座の「Step9. ビットマップビューワを作る」と「Step14. DLLを作る」が参考になると思います。
> 一応完成したAPE(AppendMissionEditorの略)からアクセスする方法がわからないということです。
> アクセスはAPEからでいいんですが、DLLの作成時に、コードは書かなくてもいいのでしょうか?
リンク先のコードをここにペーストして欲しいのでしょうか。
失礼ですが、しっかりとリンク先を読んでくれませんか?
DLL側にどんなコードを書くのか、DLLを呼び出すプログラム側にはサンプル的ですがどんなコードを書くのか、書かれているはずです。
AB3のコードなので問題があるかもしれませんが、問題に当たってから質問して下さい。
余計なお世話ですが、AME(Append Mission Editor)なのではないでしょうか?
> アクセスはAPEからでいいんですが、DLLの作成時に、コードは書かなくてもいいのでしょうか?
リンク先のコードをここにペーストして欲しいのでしょうか。
失礼ですが、しっかりとリンク先を読んでくれませんか?
DLL側にどんなコードを書くのか、DLLを呼び出すプログラム側にはサンプル的ですがどんなコードを書くのか、書かれているはずです。
AB3のコードなので問題があるかもしれませんが、問題に当たってから質問して下さい。
余計なお世話ですが、AME(Append Mission Editor)なのではないでしょうか?
> 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()関数で解放する必要があります。
説明が下手で分かり辛いかもしれません...。
白い旗上げても止まらないで...。
【DLL側】
まず、HINSTANCE型グローバル変数g_hInstanceを宣言します。
次に、DllMain()関数の中の_System_StartupProgram()関数の上の行にg_hInstance=hinstDLLを書き加えます。
で、あとはDLLのビットマップを取り出して表示したいだけなら、GetSampleBmp(),ShowBmpInWnd()関数を定義すればいいと思います。
GetSampleBmp(),ShowBmpInWnd()関数の定義はリンク先からプロジェクトにコピー&ペーストして下さい。
【呼び出しプログラム側】
呼び出し側プログラムはまずDeclare文でDLLの関数を宣言します。GetSampleBmp(),ShowBmpInWnd()関数を宣言するだけで構いません。
次に、使用目的に合わせてHBITMAP型変数hBmpをグローバルか、プロシージャ内で宣言します。
あとは、ビットマップを表示する前に、GetSampleBmp()関数でビットマップのハンドルを取得し、ShowBmpInWnd()関数で描写します。
ビットマップが要らなくなったらDeleteObject()関数で解放する必要があります。
説明が下手で分かり辛いかもしれません...。
> 間違って、ビットマップとツールバーとを勘違いしていたようです。
!?!?!?
> 話を戻しますが、ツールバーの場合も、この方法と同じなのでしょうか?
会話ができるか心配になってきました...。
1から3に聞きたいことは含まれますか?含まれないなら質問したいことを正確に書いて下さい。
下は自分に理解力がないんでしょうか。ちょっと失礼な書き方かもしれません。
> DLLから読み込むことはできました。
ビットマップの読み込みができたのですか?
> 次に、DLLが同じフォルダ内にない場合、メッセージを送ることもできました。
メッセージとはなんでしょうか?
> しかし、EXEもともとにあるコードを元にツールバーがない状態でも使えてしまいます。
何を使えるんでしょうか?
> それを防止するために、DLLがない場合、メッセージを送り、そのままプログラムを終了するにはどうすればいいですか?
試してないので分かりませんが、DLLが見つからない場合プログラムは起動しないと思いますよ。
!?!?!?
> 話を戻しますが、ツールバーの場合も、この方法と同じなのでしょうか?
会話ができるか心配になってきました...。
- 1.DLLにビットマップを詰め込んで、それを取り出してウィンドウに表示したい
2.DLLにビットマップを詰め込んで、それを取り出してツールバーに表示したい
3.DLLにツールバーを作る関数を詰め込んで、それを使ってツールバーを作りたい
1から3に聞きたいことは含まれますか?含まれないなら質問したいことを正確に書いて下さい。
下は自分に理解力がないんでしょうか。ちょっと失礼な書き方かもしれません。
> DLLから読み込むことはできました。
ビットマップの読み込みができたのですか?
> 次に、DLLが同じフォルダ内にない場合、メッセージを送ることもできました。
メッセージとはなんでしょうか?
> しかし、EXEもともとにあるコードを元にツールバーがない状態でも使えてしまいます。
何を使えるんでしょうか?
> それを防止するために、DLLがない場合、メッセージを送り、そのままプログラムを終了するにはどうすればいいですか?
試してないので分かりませんが、DLLが見つからない場合プログラムは起動しないと思いますよ。
> 2です。その通りにしたいのですが・・・。
ツールバーもウィンドウですからビットマップを描写すること自体は可能だとは思いますけど、素直にビットマップを同じプロジェクトのリソースに入れておいた方がいいんじゃないでしょうか。
CreateToolbarEx()関数の第6引数にはビットマップのリソースIDを指定するんですよね。ビットマップのハンドルだと勘違いしてたので面倒臭くなってきました...。
さっき書いた通りツールバーもウィンドウなので、ビットマップのないツールバーを作った後にビットマップを描写してしまう方法もありだと思いますが...。
ビットマップのリソースIDを指定する場合、LoadLibrary()関数を使う必要があるんでしょうか。
プログラム側からはDLLの中で定義されたリソースIDを指定できないので、定数名ではなく素直に数値で渡してしまえばいいんでしょうか...。
自分には分からない問題(というか調べるのが面倒)なので、他の方の回答を待つか、雷電さんご自身で調べて下さい。
ちなみに、どうしてツールバーに使うビットマップをDLLから読み込もうと思ったのでしょう?
ツールバーもウィンドウですからビットマップを描写すること自体は可能だとは思いますけど、素直にビットマップを同じプロジェクトのリソースに入れておいた方がいいんじゃないでしょうか。
CreateToolbarEx()関数の第6引数にはビットマップのリソースIDを指定するんですよね。ビットマップのハンドルだと勘違いしてたので面倒臭くなってきました...。
さっき書いた通りツールバーもウィンドウなので、ビットマップのないツールバーを作った後にビットマップを描写してしまう方法もありだと思いますが...。
ビットマップのリソースIDを指定する場合、LoadLibrary()関数を使う必要があるんでしょうか。
プログラム側からはDLLの中で定義されたリソースIDを指定できないので、定数名ではなく素直に数値で渡してしまえばいいんでしょうか...。
自分には分からない問題(というか調べるのが面倒)なので、他の方の回答を待つか、雷電さんご自身で調べて下さい。
ちなみに、どうしてツールバーに使うビットマップをDLLから読み込もうと思ったのでしょう?