![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateOleObject [D7, WinXP]
Woolen © (2007-04-03 11:42:00)Если кто знает, подскажите, пожалуйста. Вызываю CreateOleObject в безоконном приложении прямо в .dpr в главном блоке begin end. Передаю в фунцию ProgID. Результат присваиваю к Variant. Получаю: " Exception EOleSysError in module archivesif.exe at 00028191. Не был произведен вызов CoInitialize." Делаю то же самое, но в оконном приложении - все работает. Почему? В чем разница?
Loginov Dmitry (2007-04-04 20:30:00) [1]Сталкивался недавно тоже с проблемами при вызове CoUnInitialize() в дополнительном потоке (в коде DLL). Проблема была в том, что библиотека просто выгружалась. Пришлось убирать CoUnInitialize().
palva (2007-04-04 16:58:00) [2]Woolen © (03.04.07 15:05) [8]
> Может кто знает, какова ее природа и что с этим делать?
Природа ее такова что при финализации модуль ComObj сам вызывает CoUnInitialize, но делает это, если выполняются определенные условия.
А что с этим делать, непонятно. Можно плюнуть на это и вообще не писать CoUnInitialize. Но с другой стороны у меня есть примеры, когда ComObj не вызывает CoUnInitialize, следовательно если я сам его не вызову, наступит некоторая некорректность. Хорошо бы научиться сигнализировать ComObj, что я сам вызвал CoUnInitialize.
Сергей М. (2007-04-04 12:05:00) [3]
> достаточно вызвать 1 раз при инициализации приложения.
Если приложение мультипоточное и в доп.потоках есть OLE/COM-вызовы, то недостаточно.
KSergey (2007-04-04 12:02:00) [4]Вообще-то CoInitialize(nil) достаточно вызвать 1 раз при инициализации приложения.
Ну и CoUn.... тоже один, призавершении
umbra (2007-04-04 11:03:00) [5]вот генофонд :)
procedure TApplication.Initialize;
begin
if InitProc <> nil then TProcedure(InitProc);
end;
InitProcзначение присваивается при инициализации модуляComObj
Сергей М. (2007-04-03 15:09:00) [6]begin
CoInitialize(nil);
try
...
QQQ := CreateOleObject('QQQ.QQQ');
try
...
finally
QQQ := Unassigned;
end;
...
finally
CoUninitialize;
end;
end.
Woolen (2007-04-03 15:05:00) [7]
> 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, то все работает. Если вместе - появляется вышеозначенная ошибка. Может кто знает, какова ее природа и что с этим делать? Спасибо
Woolen (2007-04-03 12:40:00) [8]
> Сергей М. © (03.04.07 12:21) [6]
Спасибо. Все заработало.
Сергей М. (2007-04-03 12:21:00) [9]
> Woolen © (03.04.07 12:10) [3]
При вызове Application.Initialize происходит неявный вызов CoInitialize().
Не нравится Application ? Делай явныйвызов CoInitialize() !
KSergey (2007-04-03 12:19:00) [10]см тут
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1175334004&n=5
Reindeer Moss Eater (2007-04-03 12:13:00) [11]Вызови CoInitialize и создавай свои оле объекты наздоровье.
Woolen (2007-04-03 12:10:00) [12]
> Сергей М. © (03.04.07 11:48) [2]
Вот этого я непонял. У меня не вызывается Application.Initialize. У меня вообще модуль Forms не подключен. И что происходит дальше? Если его нет, я не могу вызывать CreateOleObject?
Сергей М. (2007-04-03 11:48:00) [13]
> В чем разница?
Уж точно не в наличии или отсутствии каких-то там "окон".
Просто в одном случае Application.Initialize вызывается, а в другом нет)
Reindeer Moss Eater (2007-04-03 11:44:00) [14]Потому что не был произведен вызов CoInitialize