2011-03-08 16 views
4

COMローカルサーバーを実装するWindowsサービスがあります。COMオブジェクトのメソッドをメインスレッドではなく実行する方法

アプリケーションとして実行する場合、COMオブジェクトメソッドは別の(メインではない)スレッドで呼び出されますが、これは問題ありません。サービスとして実行すると物事が変わります。COMオブジェクトメソッドはサービススレッドのコンテキストで呼び出されますが、これは私にとっては魅力的ではありません。

私はそれがマンション、MTA、STAなどと関係していることがわかります。しかし、COMが別のスレッドでオブジェクトメソッドを呼び出すように強制する方法を理解できません。

これはサービス開始時にcomオブジェクトの登録と関係がありますか?

私の環境はWindows 7 + delphiですが、C++ソリューションは歓迎されています。

更新2011-04-26
私は、「メッセージループ」の方向でソリューションを検索作っ @sharptoothする賞賛と@クリスディクソン。

STAのため、このアプリはメッセージポンプを利用してコクラスを登録したスレッドにCOMメッセージを配信します。私は、メッセージループを持つ別のスレッドにコクラスの登録を再配置し、すべてのCOMコールがそのスレッドで実行されるようになりました。私はそのアプローチを以前に試みたが、メッセージループを忘れてしまったので、これはパズルの欠けている部分だった。みんなありがとう!

+1

要求をディスパッチするメッセージループを実行していますか? – sharptooth

+2

「アプリケーションとして実行する」と「サービスとして実行する」との区別と、クライアント呼び出しがどちらの場合でも異なるプロセスから来ているかどうかを明確にすることができますか?また、COMコクラスを登録すると、どのアパートメントモデルを指定していますか? –

+0

@sharptooth:サービスのスレッドにメッセージループがあります – Nedko

答えて

1

オブジェクトは、登録したスレッドから呼び出されます。オブジェクトを別のアパートメント(STA)で呼び出す場合は、そのアパートメントからクラスオブジェクトを登録する必要があります。これは、別のスレッドを作成しそこから登録することで実現できます。

関連する問題