Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо