開発環境:VB6.0 Enterprise Edition
C++にて作成された他者作のDLLを呼び出す際に「__cdecl形式のコールバック関数のポインタを指定」とあるのですが、VBの関数を指定すると__stdcall形式になってしまいます。
これをDLL側ではなく、VB側で合わせることはできますでしょうか。
On Error で『DLLが正しく呼び出せません』エラーを無視することで、
無理矢理呼べてしまう場合もありますが、基本的には無理です。
その DLL を内部で呼び出す __stdcall な ラッパーDLLを作るか、
VB6 ではなく、VB.NET 等で開発するか、でしょう。
回答ありがとうございます。
「ラッパーDLLをつくる」とすると、やはりC++などでということになるのでしょうか。
VS6.0がインストールされているのでVC++6.0も所有はしていますが、VB以外の言語はまったく使ったことがないのでどうすればいいやら…。
そのコールバック関数の引数の数・型や戻り値の型は?
それがわかるのならば、ラッピングするコードをバイナリで
組み立てるとか。呼び出し元がDLL側なので、呼び出す仕組みを
考えずに済むでしょうし。
というか、コールバックなのになんで__cdecl形式なんでしょうかね。
windef.h には
#define CALLBACK __stdcall
となっているわけで。
> ラッピングするコードをバイナリで組み立てるとか。
かなり面倒そうですね。
ラッパDLL作成自体、基本さえわかっていれば、コードそのものは数行ですので
そんなにC/C++の知識はなくてもできそうです。
回答ありがとうございます。
使用しているDLLは「午後のこーだ」の「gogo.dll」です。
http://www.marinecat.net/free/windows/gogohelp/me_setcfg.html
上記ヘルプの「MC_INPUTFILE」の項目にて「MC_INPDEV_USERFUNC」を指定したいのですが…。
どのようにすればよいかヒントを戴ければ嬉しいです。
「午後のこーだ」のDLLは、VB(6以前)対応版の関数もExportしてたような。
お返事遅れました。
回答ありがとうございます。
「MPGE_setConfigureVB」など、VB用の関数がありますが、この関数用のリファレンスが存在していないようです。
VB用のサンプルはありますが、そこでは「MC_INPDEV_USERFUNC」を指定していないので方法がわからず困っています…。
ソースコードなども公開されているのですから、そこから調べてみれば
cdeclにしなければならないのか、それともstdcallでいいのか、の判断
がつくでしょう。その判断をするだけであれば、VC++でDLLを作るほどの
知識も要りませんよね。
回答ありがとうございます。
ソースコードを見てみました。
typedef MERET (__stdcall *MPGE_CALLBACK_VB)( void *, unsigned long );
となっていました。
VBの関数に関しては__stdcallになっているようです。
しかし、VB上では動作しますが、exe計式にするとメモリ違反のエラーが出て落ちてしまいます…。
コールバック関数自体はじめて使うので、もう少し調べてみます。
この件につきましては__stdcall使用の為、解決とさせて頂きます。
皆様、ありがとうございました。
チェック忘れました。
申し訳ありません。
ツイート | ![]() |