Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.028 c
8-1068031669
maker
2003-11-05 14:27
2004.04.11
Декодер MP3


6-1079575667
Гость 1
2004-03-18 05:07
2004.04.11
Можно ли на Дельфи 7 написать плагин к Интернет Эксплореру ?


3-1081938856
Hazg
2004-04-14 14:34
2004.04.11
Создание базы через Query в кодировке 866


14-1079261719
syte_ser78
2004-03-14 13:55
2004.04.11
Помогите ответить на вопрос


14-1079187844
Alex30
2004-03-13 17:24
2004.04.11
Может кто знает как инет файлы на ящик себе отсылать?




   Наверх