我正在对一个杂乱的项目进行调试,因为这个项目使以前的开发人员不知道他们在做什么,而主要问题是尝试对应用程序进行多线程处理失败。我现在正在清理混乱,并试图找出问题出在哪里。问题之一是为了使用ADO组件,对CoInitialize的调用不一致。

从我的previous question继续,我如何确定已调用了多少级CoInitialize

例如,请考虑以下代码:

CoInitialize(nil);
try
  CoInitialize(nil);
  try
    //2 levels have been called, how to programatically check this?
  finally
    CoUninitialize;
  end;
finally
  CoUninitialize;
end;

最佳答案

您可以这样做:

function CoInitializeCount: Integer;
var
  HR: HResult;
  I: Integer;

begin
  Result:= 0;
  repeat
    HR:= CoInitialize(nil);
    if (HR and $80000000 <> 0) then begin
      Result:= -1;
      Exit;
    end;
    CoUnInitialize;
    if (HR <> S_OK) then begin
      CoUnInitialize;
      Inc(Result);
    end
    else Break;
  until False;
  for I:= 0 to Result - 1 do
    CoInitialize(nil);
end;




警告!由于上述函数关闭了COM,因此不能在COM应用程序中使用,只能在调试时回答特定问题。

08-04 19:16