- PR -

VS2005(C++MFC)からVS2005C#で作成したDLLを呼び出す方法

1
投稿者投稿内容
まぁ
会議室デビュー日: 2008/11/05
投稿数: 19
投稿日時: 2008-11-05 13:51
以前(2005-11-30)に「CからC#を呼ぶ方法」を参考にプログラミングを行い、VC6側を「COMのカスタムインターフェイスを使った呼び出し方」で作成してみたのですが「CoCreateInstance」実行時の戻り値が「E_NOINTERFACE」となってしまい悩んでいます。どなたかご教授して頂けないでしょうか、宜しくお願い致します。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-11-05 16:21
こんにちは。

引用:

まぁさんの書き込み (2008-11-05 13:51) より:
以前(2005-11-30)に「CからC#を呼ぶ方法」を参考にプログラミングを行い、VC6側を「COMのカスタムインターフェイスを使った呼び出し方」で作成してみたのですが「CoCreateInstance」実行時の戻り値が「E_NOINTERFACE」となってしまい悩んでいます。どなたかご教授して頂けないでしょうか、宜しくお願い致します。



CLSID(クラスID)、IID(インターフェイスID)の部分が、C#側(.NET側)で作成しCOMとして登録したクラスのものと一致しているか確認してみてください。
サンプルコードそのままだと(UUID,GUIDを変更しないと)動きません。

コード:
struct __declspec(uuid("7c2d873f-c96e-3bbd-bd72-a966a62ea48b"))		<- ここのuuidはCLSID
Class1;

struct __declspec(uuid("80d757c4-2619-3a12-a5f6-a3f2ceacd1db"))		<- ここのuuidはIID
_Class1 : IDispatch


まぁ
会議室デビュー日: 2008/11/05
投稿数: 19
投稿日時: 2008-11-05 17:15
Tdnr_Symさん
早速のお返事ありがとうございます。

'CLSID'はC#の部分と合わせたのですが、
'IID'には、どの値を入れればよいか悩んでいます。
ここの辺りについては初心者で申し訳ありませんが、
'IID'の値についてご教授願えないでしょうか。

宜しくお願い致します。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-11-05 17:58
こんにちは。

引用:

'CLSID'はC#の部分と合わせたのですが、
'IID'には、どの値を入れればよいか悩んでいます。




C#側でIIDを指定できる方法もあったかと思いますが…

C#プログラムがCOMとして正しく登録できていれば
"OLE View(OLE/COM Object Viewer)"というツールで登録内容を確認できます。
(OLE ViewはVC6に付属しています)

たぶん"Type Libraries"配下に登録されていると思いますので、ダブルクリックしてください。
"ITypeLib Viewer"が開くと思います。

そのなかで
coclass XXXXX についているuuidがCLSIDです。
interface XXXX についているuuidがIIDとなります。
まぁ
会議室デビュー日: 2008/11/05
投稿数: 19
投稿日時: 2008-11-05 18:44
Tdnr_Symさん
ご回答ありがとうございます。

"ITypeLib Viewer"で開いてみました。
>coclass XXXXX についているuuidがCLSIDです。
 は見つかりました。(C#で定義した値が入っていました)

しかし、

>interface XXXX についているuuidがIIDとなります。
 は見つかりませんでした。
 'interface' で 'uuid' らしき値で試してみたのですがNGでした。
 →C#(DLL側)で定義しないとだめなのでしょうか?

まだご教授願えるのでしたらまたご回答をお願いいたします。
まぁ
会議室デビュー日: 2008/11/05
投稿数: 19
投稿日時: 2008-11-05 19:08
Tdnr_Symさん
先ほどのinterface XXXX についているuuidがIIDとなります。
が見つからなかった原因は
[ClassInterface(ClassInterfaceType.None)]にしていたため
[ClassInterface(ClassInterfaceType.AutoDual)]に直しましたら
"ITypeLib Viewer"で 'interface XXXX'が出てきました。
しかしのその'uuid'を指定してみたのですが結果はNGでした。

先ほどの報告に誤りがありました事をお詫びさせて頂きます。
まぁ
会議室デビュー日: 2008/11/05
投稿数: 19
投稿日時: 2008-11-05 19:51
Tdnr_Symさん

立続けにご報告を間違えてしまいました。
>"ITypeLib Viewer"で 'interface XXXX'が出てきました。
>しかしのその'uuid'を指定してみたのですが結果はNGでした。
正しい'uuid'を指定いたところ'CoCreateInstance'の実行結果はOKになりました。

度々の誤手順でご迷惑をおかけしました。
また、ご教授をして頂いた事を感謝します。
有難う御座いました。

今度は、C#での'IID'の指定方法を調査します。
1

スキルアップ/キャリアアップ(JOB@IT)