Когда мне нужно вызвать 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;