![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADOConnection.Open в сервисе [D7]
gunner © (2003-01-16 11:33:00)При попытке установления соеденения с базой ADOConnection.Open
возникает exception "Необходимо вызвать CoInitialize"
Что это и как с этим бороться !??
Заранее спасибо !
Delirium (2003-01-16 14:54:00) [1]Рекомендую для прочтения:
http://nps.vnet.ee/ftp/Docs/Delphi/DX/COMmodel.html
asmith (2003-01-16 14:20:00) [2]И не забывать делать инициализацию среды СОМ для каждого созданного потока, использующего сервисы СОМ! Лучше в методе Execute. Можно в сервисе вызвать инициализацию ДО создания дополнительного потока и ADO не захочет работать.
sniknik (2003-01-16 13:05:00) [3]странно, у меня таких проблем не было.
но может тебе компоненты ADO-шные попробовать в рантайме создавать? во избежание внутренних действий что дельфи по умолчанию делает. так примерно
procedure TTrfService.ServiceExecute(Sender: TService);
Begin
CoInitialize(nil);
ADOConnection:= TADOConnection.Create(nil);
...
ADOCommand:= TADOCommand.Create(nil);
...
ADOCommand.Execute; // .Open; ??? странно
.
.
CoUnInitialize;
end;
Anatoly Podgoretsky (2003-01-16 12:55:00) [4]gunner (16.01.03 12:35)
Тема в хелпе так и называется, но MSDN конечно более полный
gunner (16.01.03 12:26)
Конечно же я Вызывал его....
Не видать, обманываешь или показывать нам не хочешь тот кусок
gunner (16.01.03 12:40)
Зря ты хелп не прочитал, так сказано, что можно несколько раз и как с этим бороться. Также сказано в каких случаях его вызывать нельзя.
gunner (2003-01-16 12:51:00) [5]Да нет... конект закрыт...
собственно с этого и начался весь этот бардак...
всё прекрастно работает если скомпилить сервис с уже открытым коннектом если же я его пытаюсь в ручную уже из прилады вызвать, то он не даётся !
sniknik (2003-01-16 12:49:00) [6]то есть до вызова,
вот в голову пришло может у тебя и в отладке коннект открыт? тогда первый вызов будет гораздо раньше.
sniknik (2003-01-16 12:46:00) [7]очень логично, хелп ->
...call CoInitialize before they make any other COM library calls
gunner (2003-01-16 12:40:00) [8]> sniknik ©
Я его не запускал.. но верю тебе наслово !
Вообще CoInitialize должно вызываться один раз ещё до вызова конструкторов ADO компонент... поэтому вызывать его перед Open помоему не в полне логично !
sniknik (2003-01-16 12:39:00) [9]внеси небольшие изменения
procedure TTrfService.ServiceExecute(Sender: TService);
Begin
CoInitialize(nil);
ADOCommand.Open;
.
.
.
.
.
.
CoUnInitialize;
end;
sniknik (2003-01-16 12:36:00) [10]а пример смотрел? работает? там тоже самое только + работа с базой через dll.
gunner (2003-01-16 12:35:00) [11]Честно говоря в хелпе я ничего не нашёл про это !
Нашёл на MSDN !
А Пример кода вот:
type
TTrfService = class(TService)
Connection: TADOConnection;
GetTargetIP: TADOQuery;
Timer: TTimer;
ResetBuffer: TADOCommand;
UpdateFilter: TTimer;
CheckSnmp: TTimer;
GetCntSnmp: TADOQuery;
ListNases: TADOQuery;
ResetCounters: TADOStoredProc;
procedure ServiceExecute(Sender: TService);
procedure TimerTimer(Sender: TObject);
procedure UpdateFilterTimer(Sender: TObject);
procedure CheckSnmpTimer(Sender: TObject);
private
procedure TTrfService.ServiceExecute(Sender: TService);
Begin
ADOCommand.Open;
.
.
.
.
.
.
end;
Anatoly Podgoretsky (2003-01-16 12:28:00) [12]Значит не так или не там, но мы не телепаты, а хелп то ты посмотрел, так все прекрасно расписано, что это такое и для чего.
gunner (2003-01-16 12:26:00) [13]Конечно же я Вызывал его.... эта мысль пришла мне на ум первой..но это не помогло..после этого он всёравно пишет что необходимо вызвать CoInitialize(nil);
sniknik (2003-01-16 12:21:00) [14]толко что положил пример в кладовку, можеш посмотреть
http://delphi.mastak.ru/cgi-bin/download.pl?look=1&id=1042708779&n=1
Anatoly Podgoretsky (2003-01-16 11:49:00) [15]Ну и что тебя сдерживает выполнить эту рекомендацию?
sniknik (2003-01-16 11:38:00) [16]вызвать его!
CoInitialize(nil);
....
CoUnInitialize;