Когда мне нужно вызвать CoInitialize () в этом сценарии?

Я создаю многопоточное приложение службы Windows в Delphi XE2, которое использует компоненты базы данных ADO для подключения к SQL Server. Я использовалCoInitialize(nil); много раз, прежде чем внутри потоков, но в этом случае у меня есть функция, в которой я не уверен.

Эта функция называетсяTryConnect который пытается подключиться к базе данных с заданной строкой подключения. Возвращает true или false при успешном соединении. Проблема в том, что эта функция будет использоваться как внутри, так и вне основного служебного потока, и она будет создавать собственный временныйTADOConnection компонент, который требуетCoInitialize...

Мой вопрос мне нужно позвонитьCoInitialize внутри этой функции тоже? Если я делаю, и так как процедура выполнения службы используетCoInitialize Кроме того, будут ли они мешать, если я вызову эту функцию из службы?TryConnect Функция находится внутри объекта, который создается из основного сервисного потока (но в конечном итоге будет перемещен в свой собственный поток). Мне нужно знать, звонит лиCoInitialize() дважды из одной и той же темы (иCoUninitialize) будет мешать - и как правильно справиться с этим сценарием.

Вот код ниже ...

//This is the service app's execute procedure
procedure TJDRMSvr.ServiceExecute(Sender: TService);
begin
  try
    CoInitialize(nil);
    Startup;
    try
      while not Terminated do begin
        DoSomeWork;
        ServiceThread.ProcessRequests(False);
      end;
    finally
      Cleanup;
      CoUninitialize;
    end;
  except
    on e: exception do begin
      PostLog('EXCEPTION in Execute: '+e.Message);
    end;
  end;
end;

//TryConnect might be called from same service thread and another thread
function TDBPool.TryConnect(const AConnStr: String): Bool;
var
  DB: TADOConnection; //Do I need CoInitialize in this function?
begin
  Result:= False;
  DB:= TADOConnection.Create(nil);
  try
    DB.LoginPrompt:= False;
    DB.ConnectionString:= AConnStr;
    try
      DB.Connected:= True;
      Result:= True;
    except
      on e: exception do begin
      end;
    end;
    DB.Connected:= False;
  finally
    DB.Free;
  end;
end;

Поэтому, чтобы уточнить, что он на самом деле делает, у меня может быть такой случай:

CoInitialize(nil);
try
  CoInitialize(nil);
  try
    //Do some ADO work
  finally
    CoUninitialize;
  end;
finally
  CoUninitialize;
end;

Ответы на вопрос(2)

Ваш ответ на вопрос