COMローカルサーバーを実装するWindowsサービスがあります。COMオブジェクトのメソッドをメインスレッドではなく実行する方法
アプリケーションとして実行する場合、COMオブジェクトメソッドは別の(メインではない)スレッドで呼び出されますが、これは問題ありません。サービスとして実行すると物事が変わります。COMオブジェクトメソッドはサービススレッドのコンテキストで呼び出されますが、これは私にとっては魅力的ではありません。
私はそれがマンション、MTA、STAなどと関係していることがわかります。しかし、COMが別のスレッドでオブジェクトメソッドを呼び出すように強制する方法を理解できません。
これはサービス開始時にcomオブジェクトの登録と関係がありますか?
私の環境はWindows 7 + delphiですが、C++ソリューションは歓迎されています。
更新2011-04-26:
私は、「メッセージループ」の方向でソリューションを検索作っ @sharptoothする賞賛と@クリスディクソン。
STAのため、このアプリはメッセージポンプを利用してコクラスを登録したスレッドにCOMメッセージを配信します。私は、メッセージループを持つ別のスレッドにコクラスの登録を再配置し、すべてのCOMコールがそのスレッドで実行されるようになりました。私はそのアプローチを以前に試みたが、メッセージループを忘れてしまったので、これはパズルの欠けている部分だった。みんなありがとう!
要求をディスパッチするメッセージループを実行していますか? – sharptooth
「アプリケーションとして実行する」と「サービスとして実行する」との区別と、クライアント呼び出しがどちらの場合でも異なるプロセスから来ているかどうかを明確にすることができますか?また、COMコクラスを登録すると、どのアパートメントモデルを指定していますか? –
@sharptooth:サービスのスレッドにメッセージループがあります – Nedko