¿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? LosTryConnect
a 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;