DLLからの呼び出し
DLLからの呼び出し
最近、質問ばかりしている私ですが、以前投稿されていたDLLからツールバーのビットマップを取り出す方法がいまいちよく分からないので、教えていただけないでしょうか?自分では考えてもいるんですが、なかなか答えといったものが出ません。私がしたいことは、DLLにビットマップと関数を両方詰め込んで、それをプログラムのほうで呼び出すだけにしたいのですが
Re: DLLからの呼び出し
> DLLにビットマップと関数を両方詰め込んで、それをプログラムのほうで呼び出すだけにしたいのですが
DLL側のプロジェクトにはリソースとして適当なビットマップを挿入しておきます。
DLL側にはリソースIDを取得する関数(改良の余地あり?)と、リソースビットマップのハンドルを取得する関数を作ります。
必要であればビットマップに関する関数を作ってしまっても構わない。
DLL側のプロジェクトにはリソースとして適当なビットマップを挿入しておきます。
DLL側にはリソースIDを取得する関数(改良の余地あり?)と、リソースビットマップのハンドルを取得する関数を作ります。
必要であればビットマップに関する関数を作ってしまっても構わない。
DLL側のソース [ここをクリックすると内容が表示されます]
それらDLL側の関数を使ってビットマップをウィンドウに描写します。
コード: 全て選択
#include "BitmapDLL.idx"
'-------------------------------------------------------------------
' メモ - このファイルには、DLLの構成要素を記述します。
' (例:関数定義、グローバル変数、定数定義など)
'
' エクスポートが必要な関数には、"Export" 修飾子を指定します。
' (例:Function Export FuncName() As Long)
'-------------------------------------------------------------------
Dim hInstance As HINSTANCE
Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long
'DLLエントリポイント
Select Case fdwReason
Case DLL_PROCESS_ATTACH
'DLLがプロセス空間にロードされた時に実行されます。
hInstance=hinstDLL
_System_StartupProgram()
DllMain=1
End Select
End Function
'もっとなんかいいやり方がある気がする
Function Export GetResourceNumber(ByVal lpBitmapResourceName As BytePtr) As Long
Select Case 0
Case lstrcmp("IDB_BITMAP1",lpBitmapResourceName)
GetResourceNumber=IDB_BITMAP1
Case lstrcmp("IDB_BITMAP2",lpBitmapResourceName)
GetResourceNumber=IDB_BITMAP2
Case Else
GetResourceNumber=FALSE
End Select
End Function
'指定されたリソース値からビットマップハンドルを取得します。
Function Export LoadResourceBitmap(ByVal lpBitmapResourceNumber As Long) As HBITMAP
LoadResourceBitmap=LoadImage(hInstance,lpBitmapResourceNumber As *Byte,IMAGE_BITMAP,NULL,NULL,LR_DEFAULTCOLOR or LR_DEFAULTSIZE) As HBITMAP
End Function
呼び出し側プログラムのコード [ここをクリックすると内容が表示されます]
一応自分の環境ではグチャグチャっとした白紙に黒いペンで書いたビットマップがちゃんと表示されます。コード: 全て選択
Declare Function LoadResourceBitmap Lib "BitmapDLL" (ByVal lpBitmapResourceNumber As Long) As HBITMAP
Declare Function GetResourceNumber Lib "BitmapDLL" (ByVal lpBitmapResourceName As BytePtr) As Long
Dim hDC As HDC
Dim hMemDC As HDC
Dim hBitmap As HBITMAP
Dim BitmapReport As BITMAP
hDC=GetDC(hMainWnd)
hMemDC=CreateCompatibleDC(hDC)
'ここでDLLの関数を使ってDLLからビットマップハンドルを取得しています。
hBitmap=LoadResourceBitmap(GetResourceNumber("IDB_BITMAP1"))
GetObject(hBitmap,SizeOf(BITMAP),BitmapReport)
SelectObject(hMemDC, hBitmap)
BitBlt(hDC,0,0,BitmapReport.bmWidth,BitmapReport.bmHeight,hMemDC,0,0,SRCCOPY)
DeleteDC(hMemDC)
ReleaseDC(hMainWnd,hDC)
> えっと、いきなりで悪いのですが、ツールバーの場合はどうしたら良いでしょう?関数はすべてDLLに入れてもらいたいのですが(人に頼まない。反省②)
以前のスレッドでも十分解決できると思うんですけどね...。
最後の方CreateToolbarEx()関数について書かれていますが、第5引数にNULLを指定した場合、第6引数にはビットマップのハンドルを指定することができます。
ビットマップのハンドルはDLLから取得できたので問題の解決になったと言えるんじゃないでしょうか?
一応コードを載せますけど...。
CreateToolbarEx()を使ってる所をCreateToolbarDx()に置き換えて、第5引数にはビットマップハンドルを指定してやるだけです。
ツールバー、実際に動かすのが面倒なので新たな問題があった場合回答できないかもしれません。
以前のスレッドでも十分解決できると思うんですけどね...。
最後の方CreateToolbarEx()関数について書かれていますが、第5引数にNULLを指定した場合、第6引数にはビットマップのハンドルを指定することができます。
ビットマップのハンドルはDLLから取得できたので問題の解決になったと言えるんじゃないでしょうか?
一応コードを載せますけど...。
[ここをクリックすると内容が表示されます]
CreateToolbarDx()関数は第5引数にNULLを指定したCreateToolbarEx()関数を呼んでいるだけです。コード: 全て選択
Function Export CreateToolbarDx(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 dxBitmap As Long,ByVal dyBitmap As Long,ByVal uStructSize As DWord) As HWND
CreateToolbarDx=CreateToolbarEx(hWnd,dwStyle,wID,nBitmaps,NULL,hBitmap,lpButtons,iNumButtons,dxButton,dyButton,dxBitmap,dyBitmap,uStructSize)
End Function
CreateToolbarEx()を使ってる所をCreateToolbarDx()に置き換えて、第5引数にはビットマップハンドルを指定してやるだけです。
ツールバー、実際に動かすのが面倒なので新たな問題があった場合回答できないかもしれません。
> dyButtonが無効な識別子と出ましたが、なぜなのでしょうか。
すいません。引数が一つ足りませんでした。
どうでもいいんですが、デラックスって意味でDxにしてみたんですが、カッコいいと思いませんか(笑
すいません。引数が一つ足りませんでした。
[ここをクリックすると内容が表示されます]
これでいいはずです。コード: 全て選択
Function Export CreateToolbarDx(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=CreateToolbarEx(hWnd,dwStyle,wID,nBitmaps,NULL,hBitmap,lpButtons,iNumButtons,dxButton,dyButton,dxBitmap,dyBitmap,uStructSize)
End Function
どうでもいいんですが、デラックスって意味でDxにしてみたんですが、カッコいいと思いませんか(笑
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
というエラーが出ました。
ちゃんと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
> IDM_BITMAP2が無効な識別子と出ますがなぜでしょう?
この関数は文字列"IDB_BITMAP*"を受けると数値IDB_BITMAP*を返す関数です。
DLL側のGetResourceNumberの変更 [ここをクリックすると内容が表示されます]
DLL側にビットマップリソースを追加する度にコメントアウトしてある部分を増やす必要があります。コード: 全て選択
Function Export GetResourceNumber(ByVal lpBitmapResourceName As BytePtr) As Long
Select Case 0
Case lstrcmp("IDB_BITMAP1",lpBitmapResourceName)
GetResourceNumber=IDB_BITMAP1
/*
Case lstrcmp("IDB_BITMAP2",lpBitmapResourceName)
GetResourceNumber=IDB_BITMAP2
*/
Case Else
GetResourceNumber=FALSE
End Select
End Function
この関数は文字列"IDB_BITMAP*"を受けると数値IDB_BITMAP*を返す関数です。
早速違うプロジェクトを作成してやってみましたが、やっぱり、
のCreateToolbarDxが参照されません。
なぜか分かりませんが、(何度も質問してすいません・・・。)
失礼ですが、コードはこれで完全なのでしょうか?
コード: 全て選択
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
なぜか分かりませんが、(何度も質問してすいません・・・。)
失礼ですが、コードはこれで完全なのでしょうか?
> コンパイルを完了させても、実行したときに、画面の左上に出てきます。
> そうなるようになっているのでしょうか?もともと。
実行したときに、一体なにが画面の左上に出てくるんでしょう?
あまり人のこと言えないんですけど、しっかりと細部まで情報を書くように心がけてくださいね...。
> そうなるようになっているのでしょうか?もともと。
実行したときに、一体なにが画面の左上に出てくるんでしょう?
あまり人のこと言えないんですけど、しっかりと細部まで情報を書くように心がけてくださいね...。
DLL側のソース [ここをクリックすると内容が表示されます]
コード: 全て選択
Dim hInstance As HINSTANCE
Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long
'DLLエントリポイント
Select Case fdwReason
Case DLL_PROCESS_ATTACH
'DLLがプロセス空間にロードされた時に実行されます。
hInstance=hinstDLL
_System_StartupProgram()
DllMain=1
End Select
End Function
Function Export GetResourceNumber(ByVal lpBitmapResourceName As BytePtr) As Long
GetResourceNumber=FALSE
Select Case 0
Case lstrcmp("IDB_BITMAP1",lpBitmapResourceName)
GetResourceNumber=IDB_BITMAP1
End Select
End Function
Function Export LoadResourceBitmap(ByVal lpBitmapResourceNumber As Long) As HBITMAP
LoadResourceBitmap=LoadImage(hInstance,lpBitmapResourceNumber As *Byte,IMAGE_BITMAP,NULL,NULL,LR_DEFAULTCOLOR or LR_DEFAULTSIZE) As HBITMAP
End Function
Function Export CreateToolbarDx(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=CreateToolbarEx(hWnd,dwStyle,wID,nBitmaps,NULL,hBitmap As DWord,lpButtons,iNumButtons,dxButton,dyButton,dxBitmap,dyBitmap,uStructSize)
End Function
呼び出し側の宣言 [ここをクリックすると内容が表示されます]
コード: 全て選択
Declare Function LoadResourceBitmap Lib "BitmapDLL" (ByVal lpBitmapResourceNumber As Long) As HBITMAP
Declare Function GetResourceNumber Lib "BitmapDLL" (ByVal lpBitmapResourceName As BytePtr) As Long
Declare Function CreateToolbarDx 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