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

解決


ITS  2006-12-06 16:10:44  No: 63844  IP: 192.*.*.*

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

編集 削除
シャノン  2006-12-06 18:20:33  No: 63845  IP: 192.*.*.*

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 10:23:05  No: 63846  IP: 192.*.*.*

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

編集 削除
シャノン  2006-12-07 10:52:22  No: 63847  IP: 192.*.*.*

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-08 21:51:23  No: 63848  IP: 192.*.*.*

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

編集 削除