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

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

Ошибка при завершении консольного приложения [D6, WinXP]


Provodnick ©   (2007-03-09 16:42:00) 

Есть консольное приложение, в котором создается OLE-объект. Все нормально отрабатывает. Но при завершении приложения стабильно выдается ошибка


Exception EAccessViolation in module oleaut32.dll at 00004915.
Access violation at address 77114915 in module 'oleaut32.dll'. Read of address 1
3A798E0.


Код программы примерно следующий:


program Install;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows, Registry, ActiveX, ComObj, Classes;

.......
CoInitialize(nil);

  dsoServer:=CreateOleObject('DSO.Server');
.......
CoUninitialize;
......
end.


Ошибка возникает именно где-то после последней строчки кода. Возможно что-то в финализации модулей. Не знаю даже. Помогите пожалуйста!!!


DrPass   (2007-03-09 21:34:00) [1]


> Убрать CoUninitialize;

Да и CoInitialize тоже


palva   (2007-03-09 20:25:00) [2]


> Provodnick ©   (09.03.07 17:14) [6]
> Есть конкретные предложения по делу?

Убрать CoUninitialize;


Аноним   (2007-03-09 20:09:00) [3]

а скока реф-каунт объекта  в момент выхода на CoUninitialize?
Может там дело в том ,что после него Release неявно вызывается?


Provodnick   (2007-03-09 18:53:00) [4]

CloseServer вызываю. dsoServer:=Unassigned тоже делаю. Настораживает тот факт, что ошибка возникает именно в самом конце... Кстати, при удалении из кода CoUninitialize ошибка исчезает при вызове из cmd. Однако при вызове из Windows Installer - снова появляется.

P.S.
Эта программа используется во время инсталляции для настройки БД OLAP.


Цукор5   (2007-03-09 18:30:00) [5]

>Есть конкретные предложения по делу?
Найти объектную модель DSO.Server и внимательно ее перечитать.
Вероятно есть метод, который Вы не вызываете...что-то типа Close.
На худой конец попробовать dsoServer:=Unassigned;

P.S. не забываем про try finally/except после вызова  dsoServer:=CreateOleObject('DSO.Server');


Provodnick   (2007-03-09 17:14:00) [6]

Есть конкретные предложения по делу?


Сергей М.   (2007-03-09 17:00:00) [7]


> я мысли читать не умею


Я тоже.

И что ты при сем факте желал иметь ?)


Provodnick   (2007-03-09 16:57:00) [8]

Блин, я мысли читать не умею. Можно по конкретней.


Сергей М.   (2007-03-09 16:53:00) [9]


> С смысле?


В том самом.

В прямом.


Provodnick   (2007-03-09 16:48:00) [10]

С смысле? Прога отрабатывает без проблем. Т.е. окончание у нее такое:


.......
WriteLn('All OK!!!')
end.


"All OK!!!" выводится на консоль. После этого ошибка вылетает. Даже если весь код программы поместить в try except end - в except никогда не вываливается.


Сергей М.   (2007-03-09 16:45:00) [11]

Засада между CreateOleObject и CoUninitialize


Наверх

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