我正在对一个杂乱的项目进行调试,因为这个项目使以前的开发人员不知道他们在做什么,而主要问题是尝试对应用程序进行多线程处理失败。我现在正在清理混乱,并试图找出问题出在哪里。问题之一是为了使用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应用程序中使用,只能在调试时回答特定问题。