gpt4 book ai didi

multithreading - TThread 和 COM - "CoInitialize has not been called",尽管在构造函数中调用了 CoInitialize

转载 作者:行者123 更新时间:2023-12-03 14:45:28 25 4
gpt4 key购买 nike

我正在尝试在线程中使用 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,则必须在 Execute 方法中调用 CoInitialize。或者从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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com