¿Cuándo necesito llamar a CoInitialize () en este escenario?

Estoy creando una aplicación de servicio de Windows multiproceso en Delphi XE2 que utiliza componentes de base de datos ADO para conectarse a SQL Server. He usadoCoInitialize(nil); muchas veces antes de hilos internos, pero en este caso, tengo una función de la que no estoy seguro.

Esta función se llamaTryConnect que intenta conectarse a una base de datos con una cadena de conexión determinada. Devuelve verdadero o falso en el éxito de la conexión. El problema es que esta función se usará tanto dentro como fuera del hilo principal del servicio, y creará su propia @ temporTADOConnection componente, que requiereCoInitialize ...

Mi pregunta es si necesito llamar aCoInitialize dentro de esta función también? Si lo hago, y dado que el procedimiento de ejecución del servicio usaCoInitialize también, ¿interferirán si llamo a esta función desde el servicio? LosTryConnecta función @ está dentro de un objeto que se crea a partir del subproceso de servicio principal (pero que eventualmente se moverá a su propio subproceso). Necesito saber si llamo aCoInitialize() dos veces desde el mismo hilo (yCoUninitialize) interferirá, y cómo manejar este escenario correctamente.

Aquí está el código a continuación ...

//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;

Para aclarar lo que realmente está haciendo, podría tener una ocasión de esto:

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta