-
Доброго времени суток, уважаемые мастера!
Есть у меня небольшой прикладной сервер, обслуживает програмки-клиенты по Tcp протоколу. Фактически он служит буфером между базой данных и клиентами. Связь с базой данных осуществляется через ADO. Пока сервер был выполнен в виде обычного оконного приложения, все работало нормально. Решил я переделать сервер в виде сервиса, дабы запускался сервер автоматом без входа пользователя в систему. Да и ресурсы на окна тратить нет необходимости. Но в сервисе ADO отказывается работать категорически: "Не произведен вызов CoInitialize". Покопавшись в исходниках, нашел, что выхов этот идет в ComObj в процедуре инициализации модуля. Но процедура эта закрытая и напрямую оттуда вызвать я ее не могу. Возникает вопрос: как правильно проинициализировать COM? И может быть в сервисе вообще имеет смысл отказаться от ADO? Но BDE я вообще не хочу использовать по некоторым соображениям, а dbExpress тоже вроде бы использует ole. И что лучше по скорости работы с БД? БД - MS SQL2000
Заранее спасибо!
-
"Не произведен вызов CoInitialize".
даже по-русски и то не помогает.
-
> даже по-русски и то не помогает.
что значит "по русски не помогает"? Эта фенкция вызывается из ole32.dll. И не так все там просто Сначала делается попытка вызвать CoInintializeEx с параметрами (параметры тоже надо знать), при завершении надо вызвать CoUninitialize/ И Я НЕ УВЕРЕН, ЭТОГО БУДЕТ ДОСТАТОЧНО. Хотелось бы использовать проверенную процедуру.
-
Сорри за беспокойство. Решение проблемы уже нашел на другом форуме
-
Тест FastCGI с использованием коннекта к MSSQL
program testado;
uses
SysUtils,
ADODB,
ActiveX,
fcgiapp;
var
conMain : TADOConnection;
ads : TADODataSet;
_in, _out, _err : PFCGX_Stream;
envp : FCGX_ParamArrayType;
tmpQS, tmpRM : PChar;
counter : Integer;
begin
CoInitialize(nil);
conMain := TADOConnection.Create(nil);
ads := TADODataSet.Create(nil);
conMain.ConnectionString := 'Provider=SQLOLEDB.1;Password=***;Persist Security Info=True;User ID=***;Initial Catalog=****;Data Source=***';
conMain.LoginPrompt := False;
conMain.Connected := True;
ads.Connection := conMain;
counter := 1;
while(FCGX_Accept(_in, _out, _err, envp) >= 0) do
begin
tmpQS := FCGX_GetParam('QUERY_STRING', envp);
tmpRM := FCGX_GetParam('REQUEST_METHOD', envp);
FCGX_PutS('Content-type: text/html;'+#10#10#10#10, _out^);
FCGX_PutS('<HTML><HEAD><TITLE>MSSQL Data Test</TITLE></HEAD><BODY>', _out^);
if tmpQS<>nil then
begin
FCGX_PutS('QUERY_STRING: <BR>', _out^);
FCGX_PutS(tmpQS, _out^);
FCGX_PutS('<BR>', _out^);
end;
if tmpRM<>nil then
begin
FCGX_PutS('REQUEST_METHOD: <BR>', _out^);
FCGX_PutS(tmpRM, _out^);
FCGX_PutS('<BR>', _out^);
end;
ads.CommandText := 'Select BAName from BusinessActions';
ads.Open;
FCGX_PutS('<TABLE BORDER=1>', _out^);
while not ads.EOF do
begin
FCGX_PutS(PAnsiChar('<TR><TD WIDTH=400>' + ads.FieldByName('BAName').AsString + '</TD></TR>'), _out^);
ads.Next;
end;
FCGX_PutS('</TABLE><BR><BR>', _out^);
ads.Close;
FCGX_PutS(PAnsiChar('<H5> Вызовов - ' + IntToStr(counter) + ' </H5><BR><BR>'), _out^);
Inc(counter);
FCGX_PutS('</BODY></HTML>', _out^);
end;
CoUninitialize;
end.
-
что значит "по русски не помогает"?
Это значит тебе по-русски написали : ошибка в том, что не был произведен вызов CoInitialize, а ты спрашиваешь, что не так и что надо сделать.
-
> Решение проблемы уже нашел на другом форуме
интересно, какое? неужели более проверенное, чем CoInitialize?
-
> неужели более проверенное, чем CoInitialize? не, врядли. просто в него вселили УВЕРЕННОСТЬ. ;о)
-
> Тест FastCGI с использованием коннекта к MSSQL не с той оперы... у него указано что работа в сервисе, рабочее тело сервиса это другой поток (не все понимают), т.е. не то же самое, что консоль, а CoInitialize должен быть на каждый поток.
-
> не с той оперы... у него указано что работа в сервисе, рабочее > тело сервиса это другой поток (не все понимают), т.е. не > то же самое, что консоль, а CoInitialize должен быть на > каждый поток.
Я тупо пример дал. Ну типа, что ничего невозможного нет... :)
-
> неужели более проверенное, чем CoInitialize?
CoInitialize помог, иначе бы не писал. А вот CoInitializeEx решил проблему. Видимо дело как раз в том, что сервис предполагает несколько потоков.
-
> CoInitialize помог
CoInitialize НЕ помог....
-
CoInitialize НЕ помог....
Ой бедаааа.... Всем помогает а тут нет
-
при старте потока, в потоке CoInitializeEx(NIL, COINIT_MULTITHREADED);
при завершении потока, в потоке CoUnInitialize;
|