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

Вниз

dll с отчетом выкидывается ошибка EOleSysError   Найти похожие ветки 

 
tlan   (2004-04-23 09:43) [0]

строю свою dll-ку для выводы отчета. Но как только кидаю на форму в dll-ке компонент ADOQuery, то при вызове выкидывается ошибка: EOleSysError? Без него форма открывается нормально. Если есть вариант обойти, подскажите пожалуйста.


 
Гаврила   (2004-04-23 09:54) [1]

CoInitialize(Ex) вызвал ?


 
tlan   (2004-04-23 10:08) [2]

что-то было такое, тоже выскакивало, а что это?


 
Гаврила   (2004-04-23 10:21) [3]

В DLL, в отличие от Exe, Application.Initialize по умолчанию не вызывается.
Смотрим реализацию
procedure TApplication.Initialize;
begin
 if InitProc <> nil then TProcedure(InitProc);
end;

что такое InitProc

unit System;
...
 InitProc: Pointer;        { Last installed initialization procedure }

так вот, когда в Uses подключается модуль ComObj, в его секции Initialization мы видим код

 if not IsLibrary then
 begin
   SaveInitProc := InitProc;
   InitProc := @InitComObj;
 end;

осталось выяснить ,что такое InitComObj

procedure InitComObj;
begin
 if SaveInitProc <> nil then TProcedure(SaveInitProc);
 if (CoInitFlags <> -1) and Assigned(ComObj.CoInitializeEx) then
 begin
   NeedToUninitialize := Succeeded(ComObj.CoInitializeEx(nil, CoInitFlags));
   IsMultiThread := IsMultiThread or
     ((CoInitFlags and COINIT_APARTMENTTHREADED) <> 0) or
     (CoInitFlags = COINIT_MULTITHREADED);  // this flag has value zero
 end
 else
   NeedToUninitialize := Succeeded(CoInitialize(nil));
end;

Вроде вопросов больше быть не должно ?


 
Тимохов ©   (2004-04-23 10:26) [4]


> Гаврила   (23.04.04 09:54) [1]
> CoInitialize(Ex) вызвал ?

Вроде бы просто CoInitialize(nil) достаточно. Всегда так делал.
Что такое ex?


 
tlan   (2004-04-23 10:28) [5]

Большое Спасибо Гаврила, попытаюсь теперь разобраться.


 
Гаврила   (2004-04-23 10:36) [6]

>>Тимохов ©   (23.04.04 10:26) [4]
Зависит от потоковой модели. В большинстве случаев достаточно разумеется CoInitialize, но иногда нужен именно CoInitializeEx

или может я ввел в заблуждение таким написанием ? Ex - имелся в виду не параметр вызова :))


 
Тимохов ©   (2004-04-23 10:43) [7]


> Гаврила   (23.04.04 10:36) [6]

А это что-то типа фразы в дневнике "ученика(цы)"?

Да немного заблудился :))


 
tlan   (2004-04-23 10:48) [8]

не совсем смог разобраться. А где нужно вызывать эту CoInitialize
в программе или в dll?


 
Гаврила   (2004-04-23 10:50) [9]

В DLL


 
tlan   (2004-04-23 10:58) [10]

Undeclared indetifier: "CoInitialize"


 
Гаврила   (2004-04-23 11:06) [11]

Uses ActiveX


 
tlan   (2004-04-23 11:09) [12]

Ну неужели!!! Спасибо, получилось


 
Digitman ©   (2004-04-23 11:13) [13]


> кидаю на форму в dll-ке компонент ADOQuery, то при вызове
> выкидывается ошибка: EOleSysError?


imho, ни при чем здесь CoInitialize

ошибка, связанная с отсутствием вызова CoInitialize возникает совсем в иной ситуации и по иной причине, причем в run-time

но у тебя-то - design-time ?


 
tlan   (2004-04-23 11:20) [14]

>Digitman
В  run-time, при вызове из программы


 
Digitman ©   (2004-04-23 11:40) [15]


> В  run-time, при вызове из программы


тогда что значит "кидаю .. на форму" ? в смысле динамически создаешь экземпляр TADOQuery с владельцем = экз-р формы в DLL ?

оч сомневаюсь, что простой вызов конструктора этого компонента может вызвать исключение по отсутствующему CoInitialize

это исключение может возникнуть лишь тогда, когда объект уже сконструирован и происходит попытка вызова одного из его методов Open или Execute в код.потоке, отличном от основного

тем более, если в ран-тайм ты получил EOleSysError, почему бы не поинтересоваться кодом исключения (св-во ErrorCode) или хотя бы не привести сюда ТОЧНОЕ сообщение об исключении ?


 
Гаврила   (2004-04-23 11:46) [16]

>>Digitman ©   (23.04.04 11:40) [15]

Скорее всего, Active выставлен в True в инспекторе, соответственно исключение получаем при создании формы


 
tlan   (2004-04-23 12:01) [17]

пробовал по разному: кидал на форму ADOQuery, и создавал динамически экземляр все равно была ошибка. ADOQuery ни к чему не подключал(True=false), просто компилировал библиотеку, затем вызывал ее из программы и выкидывалась ошибка. Ошибка была не в тот момент когда я кидал на форму ADOQuery, наверное я в первый раз неправильно выразился.
Долго шел до того как я нашел в чем причина, точнее в каком компоненте. Сначала думал непривильно вызываю библиотеку, затем грешил на компонент FastReport, потом уже все остальное. Ну сейчас вроде бы, с вашей помощью во всем разобрался.


 
Гаврила   (2004-04-23 12:24) [18]

Да, покопался в коде
Оказывается, обращение к COM идет прямо в конструкторе ADOQuery, без всяких попыток открыть подключение


 
Digitman ©   (2004-04-23 12:40) [19]

есть и иное решение - не вызывать CoInitialize принудительно, а просто собрать и exe и dll с ран-тайм пакетами



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

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

Наверх




Память: 0.51 MB
Время: 0.031 c
3-1081952112
pashaz
2004-04-14 18:15
2004.04.11
Как узнать, что за база ?


8-1071678597
Japan
2003-12-17 19:29
2004.04.11
Цветное изображение в чёрно-белое


8-1071902438
CREW
2003-12-20 09:40
2004.04.11
MediaPlayer не работает в ХР


14-1079351540
nikkie
2004-03-15 14:52
2004.04.11
посоветуйте графический редактор


7-1079698523
headerr
2004-03-19 15:15
2004.04.11
Отключение прокрутки колесом мыши