Подтвердить что ты не робот

Могу ли я проверить, вызвана ли CoInitialize или нет?

В многопоточной среде с соединениями базы данных ADO я хотел бы знать, был вызван CoInitialize или нет. Как я могу проверить это?

4b9b3361

Ответ 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.