В многопоточной среде с соединениями базы данных ADO я хотел бы знать, был вызван CoInitialize или нет. Как я могу проверить это?
Могу ли я проверить, вызвана ли CoInitialize или нет?
Ответ 1
Обычно вы не должны выполнять эту проверку и просто вызываете пару 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.