Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов хранимых процедур MSSQL из сервиса (Delphi 5). [D5, MSSQL]


KAA ©   (2002-06-24 15:22:00) 

Необходимо осуществить вызов хранимой процедуры при помощи TADOStoredProc. Программа выдает ошибку "Не был произведен вызов CoInitialize".
Разъяснте чайнику, что это такое и как с этим бороться?


KAA   (2002-06-25 15:19:00) [1]

Я перед вызовом хранимой процедуры делаю CoInitialize(nil), после отработки CoUninitialize(). Не знаю, правильно ли это, но все вроде работает.


Delirium   (2002-06-25 10:52:00) [2]

> vuk © (24.06.02 19:15)

">...Естественно, CoInitialize вызывается только один раз в процессе, который использует библиотеку OLE...
Не правильно. CoInitialize должна вызываться для каждого потока"
- это я понимаю, просто Help перевел дословно, а там " CoInitialize is called only once in the process" - очевидно, под словом process подразумерается именно поток(нить), а не приложение.


Shaman_Naydak   (2002-06-24 20:23:00) [3]

Уточню.. на OnStart /OnStop - CoInitialize(nil) / CoUnInitialize;

В OnCreate /OnDestroy делать смысла нет, они выполняются в основном потоке


vuk   (2002-06-24 20:23:00) [4]

Хотя... лучше будет сделать иначе.
В OnExecute

CoInitialize(nil);
try
//здесь работа сервиса

finally
CoUninitialize;
end;

Хотя, если честно, я делаю немного иначе. Обычно весь полезный код службы выношу в отдельный поток а из TService запускается такой поток.


Shaman_Naydak   (2002-06-24 20:21:00) [5]

И не забыть в конце вызвать CoUnInitialize


vuk   (2002-06-24 20:17:00) [6]

К примеру в OnStart.

...
CoInitialize(nil);
Connection.Connected := true;
...


KAA   (2002-06-24 20:03:00) [7]

У меня есть сервис, на нем компоненты TADOStoredProc (поместил их визуально, а не создаю при помощи create). Вопрос, в какой момент надо вызывать CoInitialize ?


vuk   (2002-06-24 19:15:00) [8]

>Естественно, CoInitialize вызывается только один раз в процессе,
>который использует библиотеку OLE.
Не правильно. CoInitialize должна вызываться для каждого потока, в котором необходимо использовать COM.
Вот и MSDN о том же:

...
CoInitializeEx must be called at least once, and is usually called only once, for each threadthat uses the COM library.


Delirium   (2002-06-24 18:59:00) [9]

"...Не был произведен вызов CoInitialize...Разъяснте чайнику, что это такое и как с этим бороться?" - вызываем справку Delphi о Windows SDK, читаем ... Оказывается - "Функция CoInitialize инициализирует библиотеку Компонентно-Объектной Модели(COM). Вы должны проинициализировать библиотеку прежде, чем cможете вызывать такие функции. Приложения должны вызывать CoInitialize прежде, чем будут сделаны любые другие вызовы библиотеки COM с двумя исключениями: функция CoGetMalloc, и вызовы методов распределения памяти...Естественно, CoInitialize вызывается только один раз в процессе, который использует библиотеку OLE. Допустимы многочисленные вызовы, но результатом будет S_FALSE. Для того, чтобы правильно заканчивать работу с библиотекой, каждый успешный вызов CoInitialize, включая те которые вернули S_FALSE, должен уравновешиваться соответствующим вызовом функции CoUninitialize."/Перевожу с листа, так что несколько кривовато :)/ От себя добавлю - стоит почитать MSDN про CoInitializeEx.


KAA   (2002-06-24 18:54:00) [10]

Я вызвал до потока. :(
Если теперь востановить бы АДО компоненты, можно попробовать внутри проинициализировать.


vuk   (2002-06-24 18:45:00) [11]

CoInitialize необходимо вызывать в том же потоке(лучше, конечно, при старте потока), в котором будут выполняться обращения к COM (в данном случае - к ADO) до самого первого обращения (до установки соединения с БД в Вашем случае).


KAA   (2002-06-24 18:34:00) [12]

В самом начале, до начала цикла подпроцесса, до того как происходит первое обращение к хранимой процедуре.


vuk   (2002-06-24 18:32:00) [13]

>Я попробовал вызвать, но никакого эффекта.
В каком месте?


KAA   (2002-06-24 18:30:00) [14]

Так там наверняка есть нюансы. Я попробовал вызвать, но никакого эффекта.


vuk   (2002-06-24 18:24:00) [15]

Программа же ясно написала что нужно было делать - вызвать CoInitialize.


KAA   (2002-06-24 17:16:00) [16]

Поставил я этот ADOExpress Update Pack 2, а перед этим Delphi 5 Enterprise Update Pack и Delphi 5 ADOExpress Update.
В результате ADO компоненты просто исчезли.
Что делать то теперь?


Anatoly Podgoretsky   (2002-06-24 16:12:00) [17]

Так произведи, это обязательно, иначе работать не будет


Lord Warlock   (2002-06-24 15:51:00) [18]

Как ни странно, была та же ошибка, см.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1024732119&n=2


KAA   (2002-06-24 15:45:00) [19]

Это ADOExpress Update Pack 2 ?
Нет. А что это такое и чем черевата установка?


zx   (2002-06-24 15:28:00) [20]

Ты sp ставил?
http://info.borland.com/devsupport/delphi/mdac26.html


Наверх

Титульная страница Поиск, карта сайта Написать письмо