我正在尝试在线程中使用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没有被称为异常,我不知道为什么。
答案 0 :(得分:18)
CoInitialize
初始化执行线程的COM。 TThread
实例的构造函数在创建TThread
实例的线程中执行。 Execute
方法中的代码在新线程中执行。
这意味着如果您需要TThreadedJob
个线程来初始化COM,那么您必须在CoInitialize
方法中调用Execute
。或者是从Execute
调用的方法。以下是正确的:
procedure TThreadedJob.Execute;
begin
CoInitialize(nil);
try
// some COM stuff
finally
CoUninitialize;
end;
end;