Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.15;
Скачать: CL | DM;

Вниз

Как заставить работать ADO в сервисе NT   Найти похожие ветки 

 
Rav   (2008-07-16 08:39) [0]

Доброго времени суток, уважаемые мастера!

Есть у меня небольшой прикладной сервер, обслуживает програмки-клиенты по Tcp протоколу. Фактически он служит буфером между базой данных и клиентами. Связь с базой данных осуществляется через ADO. Пока сервер был выполнен в виде обычного оконного приложения, все работало нормально.
Решил я переделать сервер в виде сервиса, дабы запускался сервер автоматом без входа пользователя в систему. Да и ресурсы на окна тратить нет необходимости. Но в сервисе ADO отказывается работать категорически: "Не произведен вызов CoInitialize". Покопавшись в исходниках, нашел, что выхов этот идет в ComObj в процедуре инициализации модуля. Но процедура эта закрытая и напрямую оттуда вызвать я ее не могу.
Возникает вопрос: как правильно проинициализировать COM?
И может быть в сервисе вообще имеет смысл отказаться от ADO? Но BDE я вообще не хочу использовать по некоторым соображениям, а dbExpress тоже вроде бы использует ole. И что лучше по скорости работы с БД? БД - MS SQL2000

Заранее спасибо!


 
Поросенок Винни-Пух ©   (2008-07-16 08:59) [1]

"Не произведен вызов CoInitialize".

даже по-русски и то не помогает.


 
Rav   (2008-07-16 09:42) [2]


> даже по-русски и то не помогает.


что значит "по русски не помогает"?
Эта фенкция вызывается из ole32.dll. И не так все там просто
Сначала делается попытка вызвать CoInintializeEx с параметрами (параметры тоже надо знать), при завершении надо вызвать CoUninitialize/
И Я НЕ УВЕРЕН, ЭТОГО БУДЕТ ДОСТАТОЧНО. Хотелось бы использовать проверенную процедуру.


 
Rav   (2008-07-16 09:51) [3]

Сорри за беспокойство.
Решение проблемы уже нашел на другом форуме


 
Ega23 ©   (2008-07-16 09:51) [4]

Тест FastCGI с использованием коннекта к MSSQL

program testado;

{$APPTYPE CONSOLE}
{$E fci}

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

 CoUninitialize;
end.



 
Поросенок Винни-Пух ©   (2008-07-16 10:01) [5]

что значит "по русски не помогает"?

Это значит тебе по-русски написали : ошибка в том, что не был произведен вызов CoInitialize, а ты спрашиваешь, что не так и что надо сделать.


 
clickmaker ©   (2008-07-16 10:04) [6]

> Решение проблемы уже нашел на другом форуме

интересно, какое? неужели более проверенное, чем CoInitialize?


 
sniknik ©   (2008-07-16 10:20) [7]

> неужели более проверенное, чем CoInitialize?
не, врядли. просто в него вселили УВЕРЕННОСТЬ. ;о)


 
sniknik ©   (2008-07-16 10:24) [8]

> Тест FastCGI с использованием коннекта к MSSQL
не с той оперы... у него указано что работа в сервисе, рабочее тело сервиса это другой поток (не все понимают), т.е. не то же самое, что консоль, а CoInitialize должен быть на каждый поток.


 
Ega23 ©   (2008-07-16 10:34) [9]


> не с той оперы... у него указано что работа в сервисе, рабочее
> тело сервиса это другой поток (не все понимают), т.е. не
> то же самое, что консоль, а CoInitialize должен быть на
> каждый поток.


Я тупо пример дал. Ну типа, что ничего невозможного нет...  :)


 
Rav   (2008-07-16 15:08) [10]


> неужели более проверенное, чем CoInitialize?


CoInitialize помог, иначе бы не писал. А вот CoInitializeEx решил проблему. Видимо дело как раз в том, что сервис предполагает несколько потоков.


 
Rav   (2008-07-16 15:09) [11]


> CoInitialize помог

CoInitialize НЕ помог....


 
Поросенок Винни-Пух ©   (2008-07-16 15:19) [12]

CoInitialize НЕ помог....

Ой бедаааа....
Всем помогает а тут нет


 
Johnmen ©   (2008-07-16 15:25) [13]

при старте потока, в потоке
CoInitializeEx(NIL, COINIT_MULTITHREADED);

при завершении потока, в потоке
CoUnInitialize;



Страницы: 1 вся ветка

Текущий архив: 2009.03.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
15-1232060933
Григорий
2009-01-16 02:08
2009.03.15
Вопрос: Передача данных приложению


6-1200389418
chemelin
2008-01-15 12:30
2009.03.15
Помогите с winsocket в WinAPI


2-1232524798
vegarulez
2009-01-21 10:59
2009.03.15
Помогите разобраться с конвертацией из pfx в pem


2-1232942009
Drowsy
2009-01-26 06:53
2009.03.15
Не получается точно определить ширину текста на канве.


2-1232668508
ruder
2009-01-23 02:55
2009.03.15
об использовании визуальных компонентов