- PR -

マルチスレッドでのActiveXコントロールの利用

1
投稿者投稿内容
hwman
会議室デビュー日: 2006/09/24
投稿数: 11
投稿日時: 2006-10-22 03:52
あるActiveXコントロールをVC#で利用しようと思っています。
このコントロールのVC++6.0用のドキュメントを見ると
---------------------------------------------------------------------
(1) STAモデルです。
(2) インタフェースポインタを他のアパートメントに渡す場合,インタフェースポ
  インタをマーシャリングする必要があります。
  COM関数のCoMarshallerThreadInterfaceInStream,
  CoGetInterfaceAndReleadseStreamを使用して同期をとってください。
---------------------------------------------------------------------
とあるのですが、C#で利用するにはP/Invokeでこれらの関数を使う以外には方法は
無いのでしょうか?


環境
Windows2000
Access 2003
Visual C# 2005 Express Edition
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-10-22 06:58

ActiveX コントロールなら(AxHogehoge.dll がラッパになってるのなら)、普通にメインスレッドで作成して、別スレッドから操作する時は Invoke メソッドを経由して、というので十分だと思いますが。
hwman
会議室デビュー日: 2006/09/24
投稿数: 11
投稿日時: 2006-11-05 23:54
スレッドが起こされるごとにスレッド内でCOM オブジェクトを作成し
COM インターフェイスにキャストしています。

また、VC++6.0用のドキュメントにSTAモデルです。 とあるので
スレッドのアパートメントはSTAに設定しています。

このような操作は

「インタフェースポインタを他のアパートメントに渡す場合,インタフェースポ
  インタをマーシャリングする必要があります。 」
を満足しているのでしょうか?

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

このような操作は
「インタフェースポインタを他のアパートメントに渡す場合,インタフェースポ
  インタをマーシャリングする必要があります。 」
を満足しているのでしょうか?



どちらとも言えません。
てか、関係ないです。

「」内の説明は、COM オブジェクトのインターフェースポインタをスレッド境界をまたいで引き渡す場合の規約について論じています。

引用:

スレッドが起こされるごとにスレッド内でCOM オブジェクトを作成し
COM インターフェイスにキャストしています。

また、VC++6.0用のドキュメントにSTAモデルです。 とあるので
スレッドのアパートメントはSTAに設定しています。



ということなら、新しく起動したスレッド内ですべての操作が完結しているので、「COM オブジェクトのインターフェースポインタをスレッド間で引き渡す」ような操作は発生していません。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-11-07 08:38 ]
1

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