- PR -

別スレッドでCOMを呼び出すと「QueryInterface に失敗しました」のエラー

1
投稿者投稿内容
toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2006-09-28 12:17
いつもお世話になっております。

VBで作成したdllを .NET(C#)から参照設定して使用しております。
.NETからVBのdllのあるメソッド呼び出して、VBのdllが発生しているイベントを
.NETで処理をするという事をしております。


.NET側はWindows.Form がUIのアプリケーションになっており、ボタン押下のイベント等で、上記VBのdllを呼び出した場合は、イベントを受け取る事ができるのですが、
タイマー等で定期的にその処理を呼び出そうとした場合にタイトルのようなエラーとなってしまいます。
いろいろと試した結果、スレッドを新規で起こした場合にエラーになるようです。
(ボタン押下も別スレッドなので、若干外しているかもしれませんが。)

なにかこの現象について、わかる方にご教授願いたいのですが、よろしくお願いします。




きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-09-28 13:24
toppoさん、こんにちは。

↓これではないでしょうか。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24201&forum=7
toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2006-10-01 23:47

toopoです。
きくちゃんさん
ありがとうございました。

きくちゃんさんが示していただいたリンクの内容は、非常に参考になりました。
自分でいろいろと調べたのですが、
マーシャリングが必要な事がわかりました。

実際にマーシャリングするにはどうしたらいいのかがイマイチ理解できません。
この件で、分かる方もう少しご教授願えないでしょうか。
よろしくお願いします。


渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-10-02 11:59
引用:

実際にマーシャリングするにはどうしたらいいのかがイマイチ理解できません。



どうしても必要な場合以外、自力でマーシャリングを行うのは現実的ではありません。

要するに「ActiveX コントロールを生成したのとは異なるスレッドから ActiveX コントロールを操作する」ことが問題なわけです。

ということは、「ActiveX コントロールを生成したのと同じスレッドから ActiveX コントロールを操作する」ようにすればよいのです。

・ActiveX コントロールを貼り付けた From に、希望の操作を実行するメソッドを追加する
・タイマハンドラ等で、↑のメソッドを Form.Invoke() で呼び出す

とすれば、「希望の操作を実行するメソッド」が「From を生成したスレッド=ActiveX コントロールを生成したのと同じスレッド(のはず)」で行われるようになります。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-10-02 12:17 ]
toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2006-10-02 15:19
渋木さん

ありがとうございました。

もう少しお付き合い願います。
件名のような自体が起こるまでの経緯ですが、

1.あるOCXが提供され、そのOCXは、あるメソッドを呼び出すと、OnComplete, OnError のようなイベントが発生する。
2..NET C# でそのOCXをFormに貼り付けたが、イベントが発生していないように見える。
3.試しにVB6.0で使用してみると、イベントが受け取ることができた。
4.提供されたOCXを内包した、VB6.0のdllを作成した。
5.C#.NETで利用したら、無事にイベントを受取る事ができた。

という経緯があり、
そして、イベント内で そのオブジェクトのメソッド(publicメンバメソッド)を呼び出そうとすると 「QueryInterface ....」
というエラーになる。という内容でした。

そもそも、2.の段階でイベントが受取れない事を解消するべきだったのでしょうが、3、4、5等で、実現方が見つかったと
思い込んでしまい、そこに至りませんでした。


2のような現象は、解消する事が出来るのでしょうか。

2のような現象がイレギュラーな事なのか、なるべくしてなっているのかが私の調査、勉強では判明していなくて困っている状況です。
きくちゃんさん、渋木さんのレスや、参考リンク等々を見ても、原因が特定できておりません。

何かヒントでもご教授できればと思っております。
よろしくお願いします。


渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-10-02 17:16
引用:

2のような現象がイレギュラーな事なのか、なるべくしてなっているのかが私の調査、勉強では判明していなくて困っている状況です。
きくちゃんさん、渋木さんのレスや、参考リンク等々を見ても、原因が特定できておりません。



2のような現象が起こる時点でイレギュラーですね。

VB6 なんて、それこそまともにマルチスレッドに対応していませんから、C# で受け取れないイベントが VB6 で受け取れるという状況がまず不可解です。

でも

引用:

5.C#.NETで利用したら、無事にイベントを受取る事ができた。



であるなら、先に挙げた方法を応用して当座の目的は達せられますよね?

さらに踏み込んだ調査がしたいなら、ActiveX コントロールを生成したスレッドのスレッドIDと ActiveX コントロールのイベントハンドラが呼び出された時のスレッドIDを比較してみるとか。
1

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