Если на форме в виде DLL располагаю компоненты ADO, то при вызове DLL из главного модуля появляется ошибка "EOLESysError Не был произведен вызов 'Colnitialize'.Почему? Со всеми другими компонентами на форме в виде DLL все нормально. Может это только для Delphi5? Помогите.
Здравствуйте oni, Вы писали:
oni>Если на форме в виде DLL располагаю компоненты ADO, то при вызове DLL из главного модуля появляется ошибка "EOLESysError Не был произведен вызов 'Colnitialize'.Почему? Со всеми другими компонентами на форме в виде DLL все нормально. Может это только для Delphi5? Помогите.
Здравствуйте oni, Вы писали:
oni>Если на форме в виде DLL располагаю компоненты ADO, то при вызове DLL из главного модуля появляется ошибка "EOLESysError Не был произведен вызов 'Colnitialize'.Почему? Со всеми другими компонентами на форме в виде DLL все нормально. Может это только для Delphi5? Помогите.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>Здравствуйте DemAS, Вы писали:
DAS>>Здравствуйте oni, Вы писали:
DAS>> В dll скажи так:
DAS>> CoInitialize(nil)
A>Мне кажется это должны были сделать ADO компоненты при инициализации, A>ведь без dll все работает.
Дело в том, что в Application это вызывается автоматически.
A>Мне кажется проблема глубже A>Посмотри вот это http://www.softforum.ru/cbuilder.faq/faq.asp?24 A>это для BCB, но для Delphi тоже справедливо
Не спорю, что причины могут быть и другие, но когда-то пару, месяцев назад, я сам столкнулся с похожей проблемой и предложеное мной решение меня выручило.
Проверь — есть форма в dll — без проблем вызывается в приложении. Положили на форму Connection, даже не надо делать Connected:=true;, не надо устанавливать параметры соединения — просто бросили на форму TADOConnection и перекомпилировали dll. Вызываем форму из приложения — выскакивает указанная выше ошибка. ОК. Открываем dll, в функцию, коорая вызывает показ окна, перед созданием окна ставим CoInitialize(nul); Перекомпилируем dll — все становится нормально.
Здравствуйте DemAS, Вы писали:
DAS> Проверь — есть форма в dll — без проблем вызывается в приложении. Положили на форму Connection, даже не надо делать Connected:=true;, не надо устанавливать параметры соединения — просто бросили на форму TADOConnection и перекомпилировали dll. Вызываем форму из приложения — выскакивает указанная выше ошибка. ОК. Открываем dll, в функцию, коорая вызывает показ окна, перед созданием окна ставим CoInitialize(nul); Перекомпилируем dll — все становится нормально.
Я понял, но ты избавился от симптома а не от ошибки, у тебя не вызвался инициализатор, как ты думашь сколько геморой это тебе еще принесет? включи Runtime Packages и посмотри, возможно поможет.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>Я понял, но ты избавился от симптома а не от ошибки, у тебя не вызвался инициализатор, как ты думашь сколько геморой это тебе еще принесет? включи Runtime Packages и посмотри, возможно поможет.
Обязательно подумаю над этим, но наверное не сейчас а вечером дома. В любом случае, спасибо за информацию.
Re[6]: Форма Delphi в виде Dll
От:
Аноним
Дата:
10.10.02 16:28
Оценка:
Здравствуйте DemAS, Вы писали:
DAS>Здравствуйте Anatolix, Вы писали:...
kstati w DLL-kah est (esli ya ne oshibayus) 2 funkzii. Odna wyzywaetsya pri zagruzke, drugaya
pri kazhdoi inizializazii dlya klienta. Pri etom, pomoemu, s pomoshyu return value mozhno
rasskazat, wse li w poryadke pri inite. Wot tuda by i wstawit CoInitialize(nul); s drugimi
initami.
Дак эта dll загружается из главного модуля в которыом было сделано Application.Initialize, спрашивается почему не работает?
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[3]: Форма Delphi в виде Dll
От:
Аноним
Дата:
13.10.02 10:08
Оценка:
Не силён я в теории, но, похоже что в DLL требуется своя инициализация. Во всяком случае, её добавление (например Uses oleauto все проблемы снимает.
Здравствуйте Аноним, Вы писали:
А>Не силён я в теории, но, похоже что в DLL требуется своя инициализация. Во всяком случае, её добавление (например Uses oleauto все проблемы снимает.
Это наврядли. CoInitialize должен быть вызыван 1 раз для потока.
Не важно сколько там dll.
Здесь почему-то не сработали инициализеры, так что проблема глубже.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>Здравствуйте Аноним, Вы писали:
А>>Не силён я в теории, но, похоже что в DLL требуется своя инициализация. Во всяком случае, её добавление (например Uses oleauto все проблемы снимает.
A>Это наврядли. CoInitialize должен быть вызыван 1 раз для потока. A>Не важно сколько там dll.
A>Здесь почему-то не сработали инициализеры, так что проблема глубже.
Зуб даю, что дело в этом коде, который можно найти в DBTables.pas:
procedure InitDBTables;
begin
if SaveInitProc <> nil then TProcedure(SaveInitProc);
NeedToUninitialize := Succeeded(CoInitialize(nil));
end;
initializationif not IsLibrary then
begin
SaveInitProc := InitProc;
InitProc := @InitDBTables;
end;
Sessions := TSessionList.Create;
Session := TSession.Create(nil);
Session.SessionName := 'Default'; { Do not localize }
InitializeCriticalSection(CSNativeToAnsi);
InitializeCriticalSection(CSAnsiToNative);
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
То что ты привел это для BDE а не ADO, но наверное для ADO что-то похожее.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев