VB6.0のDLLをVC++.NETで呼び出すには?

解決


ITS  2006-12-07 01:10:44  No: 63844

プログラムを始めてまだ期間が短い私ですが、
タイトルの通り、VB6.0で作成されたDLLファイルを、VC++.NETの環境で
作成したアプリケーションから呼び出そうとしていますが、ソースファイル
のコンパイルは上手くいっても、リンクのところでエラーメッセージが
出てしまいます。
ネット上にはを「VBで作成可能なのはActiveX DLLである」というような事
が書いてありましたが、何か関係があるのでしょうか?
解決する方法がありましたら、教えて下さい。
以上、宜しくお願いします。


シャノン  2006-12-07 03:20:33  No: 63845

VB 6.0 で作れる DLL は、ActiveX DLL です。
ActiveX というのは COM を拡張した技術であり、VC++ から呼び出そうとするなら、COM の流儀にのっとって呼ばなければなりません。
VC++ で DLL を作ると、好きな名前の関数を外部に公開できますが、ActiveX DLL が外部に公開している関数は以下の4つだけです。

・DllGetClassObject
・DllcanUnloadNow
・DllRegisterServer
・DllUnregisterServer

VB 6.0 の関数を呼びたければ、

1:DllGetClassObject で IClassFactory を作成し
2:IClassFactory::CreateInstance で、VB 6.0 で作ったクラスモジュールのインスタンスを作成し
3:そのインスタンスの IDispatch インターフェイスを取得し
4:IDispatch のメソッド経由で VB 6.0 のメソッドを呼ぶ

という流れになる…のかな?
(ActiveX については浅学で申し訳ない)

まぁ、手順は書いてみましたが、何のことかわからないかと思います。
興味があったら COM について調べてみてください。
面倒くさそうだったら、諦めたほうがいいと思います。よほどの理由が無い限り、頑張って実現しても手間に見合った成果はないかと…


ITS  2006-12-07 19:23:05  No: 63846

シャノンさん、ご回答ありがとうございます。
VB 6.0に限定しての話で進めておりますが、
もし、VB 6.0よりバージョンが新しいものであれば
解決できる…なんてことはあるのでしょうか?


シャノン  2006-12-07 19:52:22  No: 63847

VB 6.0 の次は VB 7.0(VB.NET 2002)ですが、こいつでも VC++ から呼び出せる DLL は作れません。
今度は ActiveX DLL ではなく .NET DLL になってしまいます。

残念ながら「VC++ で作れる Win32 DLL は、VB ではどのバージョンであろうと作れません」という回答になります。

ただし、VC++ の側も .NET にあわせれば、VC++.NET で作った .NET アプリから、VB.NET で作った .NET DLL を呼び出すことは可能です。


ITS  2006-12-09 06:51:23  No: 63848

シャノンさん、ご回答ありがとうございます。
参考になりました。
また、この話題で進展がありましたら教えて下さい。


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

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






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