我可以查看是否已调用CoInitialize?

Jer*_*dge 17 delphi activex ado delphi-xe2

在具有ADO数据库连接的多线程环境中,我想知道是否已调用CoInitialize.我该如何检查?

klu*_*udg 14

通常你不应该做这个检查只是打电话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;
Run Code Online (Sandbox Code Playgroud)

如果CoInitialize在一个线程中多次调用,则没有问题.第一个调用应该返回S_OK,所有后续调用都应该返回S_FALSE.所有这些呼叫都被认为是成功的,应该通过CoUnInitialize呼叫配对.如果CoInitialize在一个线程中调用了n次,则只有最后一个第n个CoUnInitialize调用关闭COM.

  • @TLama - 我猜`CO_E_ALREADYINITIALIZED`永远不会被`CoInitialize`返回,它特定于其他COM函数. (3认同)
  • @Serg,现在我正在查看在我的Delphi 2009`Windows.pas`单元中定义的带有注释`CoInitialize的常量CO_E_ALREADYINITIALIZED = HRESULT($ 800401F1)`常量,并想知道该常量的含义是什么。您以前看过或遇到过这个吗?那不是返回随后的`CoInitialize`函数调用的内容吗(现在无法验证)? (2认同)