2016-08-15 113 views
8

スレッド内でCOMインターフェイスを使用しようとしています。私が読んだことから、私はCoInitialize/CoUninitializeを各スレッドに呼び出す必要があります。TThreadとCOM - "CoInitializeが呼び出されていません"、CoInitializeがコンストラクタで呼び出されました

これが正常に動作している間に:私は、コンストラクタの呼び出しとデストラクタ移動したときに

procedure TThreadedJob.Execute; 
begin 
    CoInitialize(nil); 

    // some COM stuff 

    CoUninitialize; 
end; 

を:

TThreadedJob = class(TThread) 
... 
    protected 
    procedure Execute; override; 
    public 
    constructor Create; 
    destructor Destroy; override; 
... 

constructor TThreadedJob.Create; 
begin 
    inherited Create(True); 
    CoInitialize(nil); 
end; 

destructor TThreadedJob.Destroy; 
begin 
    CoUninitialize; 
    inherited; 
end; 

procedure TThreadedJob.Execute; 
begin 

    // some COM stuff 

end; 

を私はEOleExceptionを得る:のCoInitializeは例外は呼び出されていないと私はありません持っていますなぜなら。

答えて

18

CoInitializeは、実行中のスレッドに対してCOMを初期化します。 TThreadインスタンスのコンストラクタは、TThreadインスタンスを作成するスレッドで実行されます。 Executeメソッドのコードは、新しいスレッドで実行されます。

これは、TThreadedJobスレッドでCOMを初期化する必要がある場合、メソッドでCoInitializeを呼び出す必要があることを意味します。またはExecuteから呼び出されるメソッド。以下は正しいです:

procedure TThreadedJob.Execute; 
begin 
    CoInitialize(nil); 
    try  
    // some COM stuff 
    finally 
    CoUninitialize; 
    end; 
end; 
+0

雷の高速応答ありがとうございます。 – forsajt

関連する問題