ページ 12

DLLからの呼び出し

Posted: 2006年4月04日(火) 15:52
by GTR
最近、質問ばかりしている私ですが、以前投稿されていたDLLからツールバーのビットマップを取り出す方法がいまいちよく分からないので、教えていただけないでしょうか?自分では考えてもいるんですが、なかなか答えといったものが出ません。私がしたいことは、DLLにビットマップと関数を両方詰め込んで、それをプログラムのほうで呼び出すだけにしたいのですが

Re: DLLからの呼び出し

Posted: 2006年4月04日(火) 16:45
by 7
> DLLにビットマップと関数を両方詰め込んで、それをプログラムのほうで呼び出すだけにしたいのですが
DLL側のプロジェクトにはリソースとして適当なビットマップを挿入しておきます。

DLL側にはリソースIDを取得する関数(改良の余地あり?)と、リソースビットマップのハンドルを取得する関数を作ります。
必要であればビットマップに関する関数を作ってしまっても構わない。 それらDLL側の関数を使ってビットマップをウィンドウに描写します。 一応自分の環境ではグチャグチャっとした白紙に黒いペンで書いたビットマップがちゃんと表示されます。

Posted: 2006年4月04日(火) 19:52
by GTR
7さん。返信ありがとうございます。
えっと、いきなりで悪いのですが、ツールバーの場合はどうしたら良いでしょう?関数はすべてDLLに入れてもらいたいのですが(人に頼まない。反省②)

Posted: 2006年4月04日(火) 23:23
by 7
> えっと、いきなりで悪いのですが、ツールバーの場合はどうしたら良いでしょう?関数はすべてDLLに入れてもらいたいのですが(人に頼まない。反省②)
以前のスレッドでも十分解決できると思うんですけどね...。
最後の方CreateToolbarEx()関数について書かれていますが、第5引数にNULLを指定した場合、第6引数にはビットマップのハンドルを指定することができます。
ビットマップのハンドルはDLLから取得できたので問題の解決になったと言えるんじゃないでしょうか?

一応コードを載せますけど...。 CreateToolbarDx()関数は第5引数にNULLを指定したCreateToolbarEx()関数を呼んでいるだけです。
CreateToolbarEx()を使ってる所をCreateToolbarDx()に置き換えて、第5引数にはビットマップハンドルを指定してやるだけです。
ツールバー、実際に動かすのが面倒なので新たな問題があった場合回答できないかもしれません。

Posted: 2006年4月05日(水) 09:45
by GTR
早速入れてやってみましたが、
dyButtonが無効な識別子と出ましたが、なぜなのでしょうか。
普通はこれでできるはずが、
何か記述を間違えられているようですが・・・。
こちらも検索中です。

Posted: 2006年4月05日(水) 09:56
by 7
> dyButtonが無効な識別子と出ましたが、なぜなのでしょうか。
すいません。引数が一つ足りませんでした。 これでいいはずです。
どうでもいいんですが、デラックスって意味でDxにしてみたんですが、カッコいいと思いませんか(笑

Posted: 2006年4月05日(水) 10:06
by GTR
Dxがデラックスですか。
思いつきませんでしたねー。
コンパイルして、ちゃんとできました。
呼び出し側は、関数を呼んでくるだけでいいですね。
ありがとうございました

Posted: 2006年4月05日(水) 12:15
by GTR
CreatToolBarDxを参照できません
というエラーが出ました。
ちゃんとDLLを呼んでるはずなのに

Declare Function CreatToolBarDx Lib "BitmapDLL" (ByVal hWnd As HWND,ByVal dwStyle As DWord,ByVal wID As DWord,ByVal nBitmaps As Long,ByVal hBitmap As HBITMAP,ByVal lpButtons As VoidPtr,ByVal iNumButtons As Long,ByVal dxButton As Long,ByVal dyButton As Long,ByVal dxBitmap As Long,ByVal dyBitmap As Long,ByVal uStructSize As DWord) As HWND

Posted: 2006年4月05日(水) 13:13
by 7
> CreatToolBarDxを参照できません
CreatToolBarDxではなく、CreateToolbarDxです。惜しい...。
C&Pじゃなくてある程度手書きのようですね。偉いと思います。

Posted: 2006年4月05日(水) 15:53
by GTR
すいませんでした、単なる記述ミス、こちらのほうでした。
>C&Pじゃなくてある程度手書きのようですね。偉いと思います。
ありがとうございます。始めのとこだけ手書きです。
それでも、まだ出るのですが、やっぱりおかしいです。
CreateToolbarDxが参照できませんとでて、IDM_BITMAP2が無効な識別子と出ますがなぜでしょう?

Posted: 2006年4月05日(水) 16:39
by 7
> IDM_BITMAP2が無効な識別子と出ますがなぜでしょう? DLL側にビットマップリソースを追加する度にコメントアウトしてある部分を増やす必要があります。
この関数は文字列"IDB_BITMAP*"を受けると数値IDB_BITMAP*を返す関数です。

Posted: 2006年4月05日(水) 18:04
by GTR
早速違うプロジェクトを作成してやってみましたが、やっぱり、

コード: 全て選択

Declare Function CreatToolBarDx Lib "BitmapDLL" (ByVal hWnd As HWND,ByVal dwStyle As DWord,ByVal wID As DWord,ByVal nBitmaps As Long,ByVal hBitmap As HBITMAP,ByVal lpButtons As VoidPtr,ByVal iNumButtons As Long,ByVal dxButton As Long,ByVal dyButton As Long,ByVal dxBitmap As Long,ByVal dyBitmap As Long,ByVal uStructSize As DWord) As HWND
のCreateToolbarDxが参照されません。
なぜか分かりませんが、(何度も質問してすいません・・・。)
失礼ですが、コードはこれで完全なのでしょうか?

Posted: 2006年4月05日(水) 18:18
by 7
> 早速違うプロジェクトを作成してやってみましたが、やっぱり、
> 中略
> のCreateToolbarDxが参照されません。
ですから...、CreatToolBarDxではなくCreateToolbarDxです。
コードを見るとCreatToolBarDxとなってますけど。

Posted: 2006年4月06日(木) 16:02
by GTR
自分もおかしいと思いました(投稿してから)
それでもおかしいと思ったので、
始めから見直して、プログラムしてみましたが、
ちゃんとできません。
コンパイルを完了させても、実行したときに、画面の左上に出てきます。
そうなるようになっているのでしょうか?もともと。

Posted: 2006年4月06日(木) 16:29
by 7
> コンパイルを完了させても、実行したときに、画面の左上に出てきます。
> そうなるようになっているのでしょうか?もともと。
実行したときに、一体なにが画面の左上に出てくるんでしょう?
あまり人のこと言えないんですけど、しっかりと細部まで情報を書くように心がけてくださいね...。