17

在具有 ADO 数据库连接的多线程环境中,我想知道是否调用了 CoInitialize。我将如何检查这个?

4

1 回答 1

15

通常你不应该做这个检查而只是跟注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。

于 2013-01-26T23:55:49.820 回答