我正在尝试在线程内使用COM接口(interface)。从我所读的内容中,我必须在每个线程中调用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没有被称为异常,我也不知道为什么。
最佳答案
CoInitialize
初始化执行线程的COM。 TThread
实例的构造函数在创建TThread
实例的线程中执行。 Execute
方法中的代码在新线程中执行。
这意味着,如果需要TThreadedJob
线程来初始化COM,则必须在CoInitialize
方法中调用Execute
。或从Execute
调用的方法。以下是正确的:
procedure TThreadedJob.Execute;
begin
CoInitialize(nil);
try
// some COM stuff
finally
CoUninitialize;
end;
end;
关于multithreading - TThread和COM- "CoInitialize has not been called",尽管在构造函数中调用了CoInitialize,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38962424/