C#で作成したDLLをVC++6.0から呼ぼうとしているのですが
うまくいきません。
とりあえず、ごくごくシンプルなライブラリをC#で作成し、
gacutil /i ComLib.dll
regasm ComLib.dll
というようにCOMとして呼べるように登録しました。
このライブラリは、vbスクリプトから呼べるのを確認しました。
そして、やりたいことであるVC++6.0からの呼び出しですが、
#import ./lib/ComLib.dll no_namespace named_guids raw_interfaces_only
と書いたところで、
fatal error C1083: タイプ ライブラリ ファイルがオープンできません。'./lib/ComLib.dll': タイプ
ライブラリ/DLL の読み込みエラーです。
のエラーが出てしまいました。
このあたりお詳しい方いらっしゃいますか?
TlbExp.exeでタイプライブラリを作成しないと、ネイティブなVC6環境では使えないでし
ょう。
公開するクラスに↓の指定を行い、
[ClassInterface(ClassInterfaceType.AutoDual)]
TlbExp ComLib.dll /out:ComLib.tlb
として、タイプライブラリを作成してみました。
そして、ComLib.dllと同じフォルダにおいて、再びVC++6.0でコンパイルしてみましたが
エラー内容は変わりませんでした。
使い方が間違ってるのかなぁ~。さらに調査します。
ComLib.tlbを#importしていますか?
もしかしたら、#importじゃうまくいかないのかも。
出来ない場合、CLSIDFromProgIDあたりを呼んで1個ずつやっていくしかないのかも。
参考:CからC#を呼ぶ方法
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=26471
で Tdnr_Symさんが説明されています。(VC6なのでMC++を使う1番の方法はありえません)
//#import ./lib/ComLib.dll no_namespace named_guids raw_interfaces_only
は、↓に変更したらOKでした。
#import ./lib/ComLib.tlb no_namespace named_guids raw_interfaces_only
ちゃんと理解しないで、みようみまねでやってるから思いもしませんでした。
あとは、Tdnr_Symさんのカスタムインタフェースのパターンで、
カスタムインターフェイスの定義は、ビルドしたら自動で作成されたので、
↓でOKでした。
::CoInitialize(0);
_Class1* m_pClass1;
HRESULT m_hResult = ::CoCreateInstance((REFCLSID) CLSID_Class1, 0,
CLSCTX_INPROC_SERVER,
(REFIID)IID__Class1, (LPVOID*)&m_pClass1);
if(!SUCCEEDED(m_hResult) ) {
return;
}
long b = 0;
HRESULT result = m_pClass1->Test1(&b);
::CoUninitialize();
Blueさん、ものすごい早いレスでありがとうございました。
一応わかっているかもしれませんが、CoCreateInstanceしたらそれに対応してReleseも
記述してください。
m_pClass1->Release();
あれ?既存の処理(VBで作成したCOM呼び出し)のほうにも入ってなかったです。
ご指摘ありがとうございます。