__cdecl形式のコールバックにするには?

解決


緒太助  2007-04-25 00:44:51  No: 98626

開発環境:VB6.0 Enterprise Edition

C++にて作成された他者作のDLLを呼び出す際に「__cdecl形式のコールバック関数のポインタを指定」とあるのですが、VBの関数を指定すると__stdcall形式になってしまいます。
これをDLL側ではなく、VB側で合わせることはできますでしょうか。


魔界の仮面弁士  2007-04-25 02:10:48  No: 98627

On Error で『DLLが正しく呼び出せません』エラーを無視することで、
無理矢理呼べてしまう場合もありますが、基本的には無理です。

その DLL を内部で呼び出す __stdcall な ラッパーDLLを作るか、
VB6 ではなく、VB.NET 等で開発するか、でしょう。


緒太助  2007-04-25 03:01:01  No: 98628

回答ありがとうございます。
「ラッパーDLLをつくる」とすると、やはりC++などでということになるのでしょうか。

VS6.0がインストールされているのでVC++6.0も所有はしていますが、VB以外の言語はまったく使ったことがないのでどうすればいいやら…。


K.J.K.  2007-04-25 18:28:47  No: 98629

そのコールバック関数の引数の数・型や戻り値の型は?
それがわかるのならば、ラッピングするコードをバイナリで
組み立てるとか。呼び出し元がDLL側なので、呼び出す仕組みを
考えずに済むでしょうし。


Blue  2007-04-25 19:31:32  No: 98630

というか、コールバックなのになんで__cdecl形式なんでしょうかね。

windef.h には

#define CALLBACK __stdcall

となっているわけで。

> ラッピングするコードをバイナリで組み立てるとか。
かなり面倒そうですね。

ラッパDLL作成自体、基本さえわかっていれば、コードそのものは数行ですので
そんなにC/C++の知識はなくてもできそうです。


緒太助  2007-04-25 19:37:51  No: 98631

回答ありがとうございます。
使用しているDLLは「午後のこーだ」の「gogo.dll」です。

http://www.marinecat.net/free/windows/gogohelp/me_setcfg.html
上記ヘルプの「MC_INPUTFILE」の項目にて「MC_INPDEV_USERFUNC」を指定したいのですが…。

どのようにすればよいかヒントを戴ければ嬉しいです。


K.J.K.  2007-04-25 20:06:37  No: 98632

「午後のこーだ」のDLLは、VB(6以前)対応版の関数もExportしてたような。


緒太助  2007-04-29 15:43:53  No: 98633

お返事遅れました。
回答ありがとうございます。

「MPGE_setConfigureVB」など、VB用の関数がありますが、この関数用のリファレンスが存在していないようです。
VB用のサンプルはありますが、そこでは「MC_INPDEV_USERFUNC」を指定していないので方法がわからず困っています…。


K.J.K.  2007-04-29 17:52:30  No: 98634

ソースコードなども公開されているのですから、そこから調べてみれば
cdeclにしなければならないのか、それともstdcallでいいのか、の判断
がつくでしょう。その判断をするだけであれば、VC++でDLLを作るほどの
知識も要りませんよね。


緒太助  2007-04-29 23:52:56  No: 98635

回答ありがとうございます。
ソースコードを見てみました。

typedef  MERET (__stdcall *MPGE_CALLBACK_VB)( void *, unsigned long );

となっていました。
VBの関数に関しては__stdcallになっているようです。

しかし、VB上では動作しますが、exe計式にするとメモリ違反のエラーが出て落ちてしまいます…。

コールバック関数自体はじめて使うので、もう少し調べてみます。


緒太助  2007-04-30 08:19:13  No: 98636

この件につきましては__stdcall使用の為、解決とさせて頂きます。
皆様、ありがとうございました。


緒太助  2007-04-30 08:19:40  No: 98637

チェック忘れました。
申し訳ありません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加