Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Внизdll с отчетом выкидывается ошибка EOleSysError Найти похожие ветки
← →
tlan (2004-04-23 09:43) [0]строю свою dll-ку для выводы отчета. Но как только кидаю на форму в dll-ке компонент ADOQuery, то при вызове выкидывается ошибка: EOleSysError? Без него форма открывается нормально. Если есть вариант обойти, подскажите пожалуйста.
← →
tlan (2004-04-23 09:43) [0]строю свою dll-ку для выводы отчета. Но как только кидаю на форму в dll-ке компонент ADOQuery, то при вызове выкидывается ошибка: EOleSysError? Без него форма открывается нормально. Если есть вариант обойти, подскажите пожалуйста.
← →
Гаврила (2004-04-23 09:54) [1]CoInitialize(Ex) вызвал ?
← →
Гаврила (2004-04-23 09:54) [1]CoInitialize(Ex) вызвал ?
← →
tlan (2004-04-23 10:08) [2]что-то было такое, тоже выскакивало, а что это?
← →
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: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?
← →
Тимохов © (2004-04-23 10:26) [4]
> Гаврила (23.04.04 09:54) [1]
> CoInitialize(Ex) вызвал ?
Вроде бы просто CoInitialize(nil) достаточно. Всегда так делал.
Что такое ex?
← →
tlan (2004-04-23 10:28) [5]Большое Спасибо Гаврила, попытаюсь теперь разобраться.
← →
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:36) [6]>>Тимохов © (23.04.04 10:26) [4]
Зависит от потоковой модели. В большинстве случаев достаточно разумеется CoInitialize, но иногда нужен именно CoInitializeEx
или может я ввел в заблуждение таким написанием ? Ex - имелся в виду не параметр вызова :))
← →
Тимохов © (2004-04-23 10:43) [7]
> Гаврила (23.04.04 10:36) [6]
А это что-то типа фразы в дневнике "ученика(цы)"?
Да немного заблудился :))
← →
Тимохов © (2004-04-23 10:43) [7]
> Гаврила (23.04.04 10:36) [6]
А это что-то типа фразы в дневнике "ученика(цы)"?
Да немного заблудился :))
← →
tlan (2004-04-23 10:48) [8]не совсем смог разобраться. А где нужно вызывать эту CoInitialize
в программе или в dll?
← →
tlan (2004-04-23 10:48) [8]не совсем смог разобраться. А где нужно вызывать эту CoInitialize
в программе или в dll?
← →
Гаврила (2004-04-23 10:50) [9]В DLL
← →
Гаврила (2004-04-23 10:50) [9]В DLL
← →
tlan (2004-04-23 10:58) [10]Undeclared indetifier: "CoInitialize"
← →
tlan (2004-04-23 10:58) [10]Undeclared indetifier: "CoInitialize"
← →
Гаврила (2004-04-23 11:06) [11]Uses ActiveX
← →
Гаврила (2004-04-23 11:06) [11]Uses ActiveX
← →
tlan (2004-04-23 11:09) [12]Ну неужели!!! Спасибо, получилось
← →
tlan (2004-04-23 11:09) [12]Ну неужели!!! Спасибо, получилось
← →
Digitman © (2004-04-23 11:13) [13]
> кидаю на форму в dll-ке компонент ADOQuery, то при вызове
> выкидывается ошибка: EOleSysError?
imho, ни при чем здесь CoInitialize
ошибка, связанная с отсутствием вызова CoInitialize возникает совсем в иной ситуации и по иной причине, причем в run-time
но у тебя-то - design-time ?
← →
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, при вызове из программы
← →
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) или хотя бы не привести сюда ТОЧНОЕ сообщение об исключении ?
← →
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 в инспекторе, соответственно исключение получаем при создании формы
← →
Гаврила (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, потом уже все остальное. Ну сейчас вроде бы, с вашей помощью во всем разобрался.
← →
tlan (2004-04-23 12:01) [17]пробовал по разному: кидал на форму ADOQuery, и создавал динамически экземляр все равно была ошибка. ADOQuery ни к чему не подключал(True=false), просто компилировал библиотеку, затем вызывал ее из программы и выкидывалась ошибка. Ошибка была не в тот момент когда я кидал на форму ADOQuery, наверное я в первый раз неправильно выразился.
Долго шел до того как я нашел в чем причина, точнее в каком компоненте. Сначала думал непривильно вызываю библиотеку, затем грешил на компонент FastReport, потом уже все остальное. Ну сейчас вроде бы, с вашей помощью во всем разобрался.
← →
Гаврила (2004-04-23 12:24) [18]Да, покопался в коде
Оказывается, обращение к COM идет прямо в конструкторе ADOQuery, без всяких попыток открыть подключение
← →
Гаврила (2004-04-23 12:24) [18]Да, покопался в коде
Оказывается, обращение к COM идет прямо в конструкторе ADOQuery, без всяких попыток открыть подключение
← →
Digitman © (2004-04-23 12:40) [19]есть и иное решение - не вызывать CoInitialize принудительно, а просто собрать и exe и dll с ран-тайм пакетами
← →
Digitman © (2004-04-23 12:40) [19]есть и иное решение - не вызывать CoInitialize принудительно, а просто собрать и exe и dll с ран-тайм пакетами
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.05 c