8

スレッド内で COM インターフェイスを使用しようとしています。私が読んだことからCoInitialize/CoUninitialize、各スレッドで呼び出す必要があります。

これが正常に機能している間:

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 has not been called例外が発生しましたが、その理由がわかりません。

4

1 に答える 1

19

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

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

procedure TThreadedJob.Execute;
begin
  CoInitialize(nil);
  try    
    // some COM stuff
  finally  
    CoUninitialize;
  end;
end;
于 2016-08-15T20:23:55.747 に答える