マルチスレッドでActiveXをアクセスしたいです。

[戻る]
テンテン 2005/03/03(木) 23:54:11
初めて質問させて頂きます。
VC6.0で作ったCプログラムの中からVB6.0で作ったActiveX(EXE)を呼出すことができたの
ですが、同じCプログラムでスレッドをおこして、その中からVB6.0で作ったActiveX
(EXE)を呼出すとエラーが発生してしまいます。
--------------------------------------
 pIDispatch->GetIDsOfNames( IID_NULL, &olename, 1, GetUserDefaultLCID(), 
&dispid );
の復帰値が
 ・CoInitialize has not been called
 ・Object is not connected to server
--------------------------------------
 CのスレッドからはActiveX(EXE)は呼出せないのでしょうか?

dairygoods 2005/03/04(金) 10:56:11
メッセージの通りだと思うのですが、
そのスレッドで、CoInitialize() を呼び出していますか?

テンテン 2005/03/04(金) 12:29:22
dairygoodsさん、早速レスありがとうございます。
CoInitialize()は呼び出していません。
こんな感じで呼び出してみます。
-------------------------------------
CoInitialize(NULL);
  従来の処理
CoUninitialize();
-------------------------------------
本当にありがとうございました。

テンテン 2005/03/04(金) 16:12:14
以下の呼び出しを追加すると、
-------------------------------------
CoInitialize(NULL);
  従来の処理
CoUninitialize();
-------------------------------------
「'8001010e'
アプリケーションは、別のスレッド用にマーシャリングされたインターフェイスを呼
び出しました。」
のエラーになってしまいました。
スレッド内で使用している呼出し先のインスタンス(pIDispatch)を、スレッド起動時
の引数で受け取るようにしているのですが、これがいけないのでしょか?

dairygoods 2005/03/04(金) 17:13:41
これもメッセージの通りだと思います。

スレッド間でCOMポインタを渡さないようにする方が簡単だとは思いますが、
どうしても別スレッドに渡したいのでしたら、
CoMarshalInterThreadInterfaceInStream などを調べてみてください。

テンテン 2005/03/04(金) 19:06:47
dairygoodsさん、ありがとうございます。
oMarshalInterThreadInterfaceInStreamを調べてみます。
これで何とか解決できるように頑張ります。
エラーコード(メッセージ)から原因を調べようとする努力が足りないですね。以後、
気をつけます。
ありがとうございました。

テンテン 2005/03/04(金) 21:05:59
[[解決]]
dairygoodsさん、動きました!
今日はゆっくり寝れそうです。
本当にありがとうございました。

古いスレッドには追加発言できません。