2017-12-20 48 views
-2

メインスレッドとワーカースレッドで動的にライブラリ(COM DLLを内部的に呼び出す)の読み込みの違いを教えてください。アプリケーション開発言語のサポートのために、事前ほとんどメインスレッドとワーカースレッドでダイナミックライブラリ(内部でCOM DLLを呼び出している)をロードすることの違いは何ですか?

+0

試しましたか?あなたは何か違いを見たことがありますか?何が問題なの? – Backs

+0

ワーカースレッドでCOM Dllを登録できない – VinuthSG

+0

LoadNativeDll.exeで0x77125608(KernelBase.dll)の最初の例外が発生しました:0x8001010E:アプリケーションが異なるスレッド用にマーシャリングされたインターフェイスを呼び出しました。 – VinuthSG

答えて

0

おかげで、COMを使用するには、メインスレッド上の特別のための必要はほとんどありません。
たとえば、プロジェクト作成ウィザードでOLE/COMオプションをチェックします。
ただし、複数のワーカースレッドを使用し、ワーカースレッドでCOMを使用する場合、次の操作が必要です。

COMを使用するワーカースレッドは、COMオブジェクトを作成または使用する前に、スレッドの先頭でOLEを初期化する必要があります。
Win32 APIの場合、CoInitialize()/CoInitializeEx()です。
また、アプリケーションの開発言語によっては、同等の関数とライブラリが存在するので、それを呼び出してください。

COMを使用するワーカースレッドは、UIを担当するメインスレッドによって実行されるWindowsメッセージ処理ループとは独立して、独自のメッセージ処理ループを実行する必要があります。

使用しているCOMコンポーネントに注意してください。
COMコンポーネントが登録されているThreadingModel in the registryの値が空の文字列(何も設定されていない)である場合、イベントがワークスレッドに通知されず、例外が発生することがあります。
このレジストリに値がない場合は、 "Apartment"と記入してください。

COMオブジェクトは、基本的に作成したスレッドからのみ使用してください。
COMオブジェクトがCOMオブジェクトを作成したスレッドではない別のスレッドから呼び出された場合、エラーが発生したり、通常の操作が実行されないことがあります。

その他の注意:
ワーカースレッドを終了するには、上記のクリーンアップを実行する必要があります。
COMオブジェクトを終了および解放し、メッセージ処理ループを停止し、CoUnintialize()などを呼び出します。
ワーカースレッド内で作成または割り当てられたリソースは、終了または解放する必要があります。

関連する問題