C#で作成したDLLをVC++6.0から呼ぶ – プログラミング – Home

C#で作成したDLLをVC++6.0か...
 
通知
すべてクリア

[解決済] C#で作成したDLLをVC++6.0から呼ぶ


たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

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 の読み込みエラーです。
のエラーが出てしまいました。

このあたりお詳しい方いらっしゃいますか?


引用未解決
トピックタグ
C#
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

TlbExp.exeでタイプライブラリを作成しないと、ネイティブなVC6環境では使えないでし
ょう。


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

公開するクラスに↓の指定を行い、
[ClassInterface(ClassInterfaceType.AutoDual)]

TlbExp ComLib.dll /out:ComLib.tlb
として、タイプライブラリを作成してみました。

そして、ComLib.dllと同じフォルダにおいて、再びVC++6.0でコンパイルしてみましたが
エラー内容は変わりませんでした。
使い方が間違ってるのかなぁ~。さらに調査します。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

ComLib.tlbを#importしていますか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

もしかしたら、#importじゃうまくいかないのかも。
出来ない場合、CLSIDFromProgIDあたりを呼んで1個ずつやっていくしかないのかも。

参考:CからC#を呼ぶ方法
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=26471
で Tdnr_Symさんが説明されています。(VC6なのでMC++を使う1番の方法はありえません)


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

//#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さん、ものすごい早いレスでありがとうございました。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

一応わかっているかもしれませんが、CoCreateInstanceしたらそれに対応してReleseも
記述してください。

m_pClass1->Release();


返信引用
匿名
 匿名
(@匿名)
ゲスト
結合: 1秒前
投稿: 0
 

あれ?既存の処理(VBで作成したCOM呼び出し)のほうにも入ってなかったです。
ご指摘ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました