在具有ADO数据库连接的多线程环境中,我想知道是否已经调用了CoInitialize。我该如何检查这一点?
通常情况下,您不应该进行此检查,而是直接调用CoInitialize
/CoUninitialize
对。但仍然可以像这样执行:
function IsCoInitialized: Boolean;
var
HR: HResult;
begin
HR:= CoInitialize(nil);
Result:= (HR and $80000000 = 0) and (HR <> S_OK);
if (HR and $80000000 = 0) then CoUnInitialize;
end;
在线程中多次调用CoInitialize
没有问题。第一次调用应返回S_OK
,所有后续调用应返回S_FALSE
。所有这些调用都被视为成功,并且应该由CoUnInitialize
调用成对出现。如果在线程中调用了CoInitialize
n 次,则只有最后第 n 个CoUnInitialize
调用会关闭COM。
Windows.pas
单元中定义的CO_E_ALREADYINITIALIZED = HRESULT($800401F1)
常量,并且想知道这个常量是用来干什么的。它的注释是“CoInitialize已经被调用了。”你见过或遇到过这个吗?这不是返回后续的CoInitialize
函数调用的内容吗(现在无法验证)? - TLamaCO_E_ALREADYINITIALIZED
永远不会被CoInitialize
返回,它是特定于其他COM函数的。 - kludgCoInitialize()
n
次,并且调用了 CoUninitialize()
n-1
次,那么 COM 对于该线程仍然是打开状态? - kakyo
Execute
和OnTerminate
中调用,或者在Execute
中使用try..finally
块。 - Ken WhiteCoInitialize
:https://dev59.com/um3Xa4cB1Zd3GeqPhrbz - Jerry Dodge