Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
ВнизCreateOleObject Найти похожие ветки
← →
Woolen © (2007-04-03 11:42) [0]Если кто знает, подскажите, пожалуйста. Вызываю CreateOleObject в безоконном приложении прямо в .dpr в главном блоке begin end. Передаю в фунцию ProgID. Результат присваиваю к Variant. Получаю: "Exception EOleSysError in module archivesif.exe at 00028191. Не был произведен вызов CoInitialize." Делаю то же самое, но в оконном приложении - все работает. Почему? В чем разница?
← →
Reindeer Moss Eater © (2007-04-03 11:44) [1]Потому что не был произведен вызов CoInitialize
← →
Сергей М. © (2007-04-03 11:48) [2]
> В чем разница?
Уж точно не в наличии или отсутствии каких-то там "окон".
Просто в одном случае Application.Initialize вызывается, а в другом нет)
← →
Woolen © (2007-04-03 12:10) [3]
> Сергей М. © (03.04.07 11:48) [2]
Вот этого я непонял. У меня не вызывается Application.Initialize. У меня вообще модуль Forms не подключен. И что происходит дальше? Если его нет, я не могу вызывать CreateOleObject?
← →
Reindeer Moss Eater © (2007-04-03 12:13) [4]Вызови CoInitialize и создавай свои оле объекты наздоровье.
← →
KSergey © (2007-04-03 12:19) [5]см тут
http://delphimaster.net/view/4-1175334004/
← →
Сергей М. © (2007-04-03 12:21) [6]
> Woolen © (03.04.07 12:10) [3]
При вызове Application.Initialize происходит неявный вызов CoInitialize().
Не нравится Application ? Делай явный вызов CoInitialize() !
← →
Woolen © (2007-04-03 12:40) [7]
> Сергей М. © (03.04.07 12:21) [6]
Спасибо. Все заработало.
← →
Woolen © (2007-04-03 15:05) [8]
> Woolen © (03.04.07 12:40) [7]
Вру, не все. Если я правильно понимаю, каждый CoInitialize должен закрываться CoUninitialize. Так и сделал. Выглядит примерно так:begin
CoInitialize(nil);
...
QQQ := CreateOleObject("QQQ.QQQ");
...
if not VarIsClear(QQQ) then
QQQ := Unassigned;
...
CoUninitialize;
end.
Это вызывает ошибку "Exception EAccessViolation in module ole32.dll at 00057500. Access violation at address 77537500 in module "ole32.dll". Read of address FEEEFEEE." где-то в дельфиском библиотечном коде после последнего моего end. Если вызывать или CreateOleObject, или CoUninitialize, то все работает. Если вместе - появляется вышеозначенная ошибка. Может кто знает, какова ее природа и что с этим делать? Спасибо
← →
Сергей М. © (2007-04-03 15:09) [9]begin
CoInitialize(nil);
try
...
QQQ := CreateOleObject("QQQ.QQQ");
try
...
finally
QQQ := Unassigned;
end;
...
finally
CoUninitialize;
end;
end.
← →
umbra © (2007-04-04 11:03) [10]вот генофонд :)
procedure TApplication.Initialize;
begin
if InitProc <> nil then TProcedure(InitProc);
end;InitProc
значение присваивается при инициализации модуляComObj
← →
KSergey © (2007-04-04 12:02) [11]Вообще-то CoInitialize(nil) достаточно вызвать 1 раз при инициализации приложения.
Ну и CoUn.... тоже один, призавершении
← →
Сергей М. © (2007-04-04 12:05) [12]
> достаточно вызвать 1 раз при инициализации приложения.
Если приложение мультипоточное и в доп.потоках есть OLE/COM-вызовы, то недостаточно.
← →
palva © (2007-04-04 16:58) [13]Woolen © (03.04.07 15:05) [8]
> Может кто знает, какова ее природа и что с этим делать?
Природа ее такова что при финализации модуль ComObj сам вызывает CoUnInitialize, но делает это, если выполняются определенные условия.
А что с этим делать, непонятно. Можно плюнуть на это и вообще не писать CoUnInitialize. Но с другой стороны у меня есть примеры, когда ComObj не вызывает CoUnInitialize, следовательно если я сам его не вызову, наступит некоторая некорректность. Хорошо бы научиться сигнализировать ComObj, что я сам вызвал CoUnInitialize.
← →
Loginov Dmitry © (2007-04-04 20:30) [14]Сталкивался недавно тоже с проблемами при вызове CoUnInitialize() в дополнительном потоке (в коде DLL). Проблема была в том, что библиотека просто выгружалась. Пришлось убирать CoUnInitialize().
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c