タイトル | : Dll 内の関数を別の Dll を使って呼び出したい。 |
記事No | : 15923 |
投稿日 | : 2014/07/07(Mon) 17:11 |
投稿者 | : みゆき族 |
初めまして。みゆき族と申します。 プログラミング歴、VB 歴ともに恥ずかしながら3か月足らずです。
こちらの掲示板はいつも良く参考にさせて頂いております。 特に魔界の仮面弁士様の回答は自分の問題と関係するところが多く、非常に為になっております。有難うございます。
さて、早速ですが、質問させて頂きます。
ある Dll( Dll_A とします) 内にある関数( foo とします)を別の Dll( Dll_B とします) から呼び出したいのですが、どうすれば宜しいでしょうか?
Dll_A 内にある関数は declare 関数を使って、以下のようにして呼び出せました。
'標準モジュール内 Declare Function foo Lib "Dll_A.dll" _ (ByRef val1 As Any, ByVal val2 As Long, _ ByVal val3 As Long, ByVal val4 As Long, _ ByRef val5 As Any) As Long
'フォーム内 return = foo(val1, val2, val3, val5, val6)
ここで、別の Dll を介して Dll_A を呼び出したいという要望を受け、VB6 の ActiveX Dll から Dll_B を作成しました。 DLL_B の中身は以下の通りです。(海外の情報を参考にしました)
Option Explicit
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal mParam As Long) As Long
Private Function bar(val1 As Long, val2 As Long, val3 As Long, val4 As Long, val5 As Long) On Error Resume Next 'We're going to call an API-function, without declaring it! Dim lb As Long, pa As Long 'map 'user32' into the address space of the calling process. lb = LoadLibrary("Dll_A") 'retrieve the address of 'SetWindowTextA' pa = GetProcAddress(lb, "foo") 'Call the SetWindowTextA-function CallWindowProc pa, ByVal val1, ByVal val2, ByVal val3, ByVal val4, ByVal val5 'unmap the library's address FreeLibrary lb End Function
(参考にしたコードここから) Create a New project And add this code To Form1 Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Sub Form_Load() On Error Resume Next 'We're going to call an API-function, without declaring it! Dim lb As Long, pa As Long 'map 'user32' into the address space of the calling process. lb = LoadLibrary("user32") 'retrieve the address of 'SetWindowTextA' pa = GetProcAddress(lb, "SetWindowTextA") 'Call the SetWindowTextA-function CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0& 'unmap the library's address FreeLibrary lb End Sub (参考にしたコードここまで)
これを実行して作成した Dll_B を冒頭と同じように declare 関数を使って、以下のようにして呼び出しました。
'標準モジュール内 Declare Function bar Lib "Dll_B.dll" _ (ByRef val1 As Any, ByVal val2 As Long, _ ByVal val3 As Long, ByVal val4 As Long, _ ByRef val5 As Any) As Long
'フォーム内 return = bar(val1, val2, val3, val4, val5)
しかし、いざコードを走らせると、 「実行時エラー'453': エントリ bar が DLL ファイル Dll_B 内に見つかりません。」 と出てしまいます。
コマンドプロンプトから DLL_B のレジストリ登録を済ませてもエラーは相変わらず表示されます。
(環境: Windows 7 Professional / Microsoft Visual Basic 6.0)
解決策はありますでしょうか? お忙しいところ恐縮ですが、諸先輩方の知恵をお借り出来れば幸いです。
宜しくお願い致します。
|