Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

CoInitialize + CoUninitialize   Найти похожие ветки 

 
hexone ©   (2004-04-26 15:19) [0]

Добрый день.
Объясните мне, плиз, баг сие али нет.
* Консольное приложение вариант 1
var
test : ITest = nil;
begin
 test := CreateCOMObject(CLASS_TEST) as ITest;
end;

Вылетает с Exception - не был вызван CoInitialize - замечательно
* Тоже самое вариант 2
var
test : ITest = nil;
begin
CoInitialize;
 test := CreateCOMObject(CLASS_TEST) as ITest;
CoUninitialize;
end;

Вылетает с Access Violation

Если в конце не писать CoUninitialize исключения нет.
Вопрос, почему?

P.S. Елманова, Трепалин "Delphi 6 технология COM" цитата:
"...Если вы в своей программе используете модуль ComObj, то инициализация COM для основного потока осуществляется этим модулем автоматически при старте приложения."
Врут! Деинициализация - да, но инициализация как минимум в Application.Initialize, которая вызывает InitComObj из ComObj.


 
clickmaker ©   (2004-04-26 15:25) [1]


> hexone ©   (26.04.04 15:19)  

А смысл: создать ком-объект и тут же CoUnitialize ? Ну если уж на то пошло:
CoInitialize;
try
test := CreateCOMObject(CLASS_TEST) as ITest;
if (test <> nil) then
  test := nil;
finally
 CoUninitialize;
end;


 
hexone ©   (2004-04-26 15:27) [2]

Exception выдает CoUnitialize, код я привел для примера.


 
clickmaker ©   (2004-04-26 15:49) [3]

Хм... Не заметил сразу, убери присвоение nil в объявлении test. Во-первых, незачем - он и так nil, а потом - это безграмотно, поскольку присвоение nil интерфейсному указателю в обжект паскале означает освобождение интерфейса


 
hexone ©   (2004-04-26 16:15) [4]


> Хм... Не заметил сразу, убери присвоение nil в объявлении
> test. Во-первых, незачем - он и так nil, а потом - это безграмотно,
> поскольку присвоение nil интерфейсному указателю в обжект
> паскале означает освобождение интерфейса

Присвоение nil глобальной переменной избавляет от бага по НЕУНИЧТОЖЕНИЮ объекта интерфейса заданного как глобальная переменная. Да и вообщем нет разницы. Если я в конце напишу test:=nil или в начале в объявлении. Причем с test:=nil также не работает.

> а потом - это безграмотно, поскольку присвоение nil интерфейсному
> указателю в обжект паскале означает освобождение интерфейса
Вот уж нет. Оно означает вызов Release, но не факт, что освобождение объекта.


 
clickmaker ©   (2004-04-26 16:21) [5]


> hexone ©   (26.04.04 16:15) [4]
> Присвоение nil глобальной переменной избавляет от бага по
> НЕУНИЧТОЖЕНИЮ объекта интерфейса заданного как глобальная
> переменная

Это как, интересно? У тебя оно приводит как раз таки к AV. Не веришь - убери да посмотри


 
hexone ©   (2004-04-26 16:28) [6]

var
punk : IInterface;
m    : IMyClass ;

begin
Coinitialize(nil);
punk := CreateCOMObject(CLASS_COMYCLASS);
 punk.QueryInterface(IID_MY,m);
m.test;
 punk := nil;
m := nil;
CoUninitialize;
end.

Убрал, посмотрел, ничего не изменилось


 
clickmaker ©   (2004-04-26 16:45) [7]


> hexone ©   (26.04.04 16:28) [6]

У меня такой код (с другими интерфейсам, ессессно) работает без AV


 
hexone ©   (2004-04-26 17:31) [8]

Да, действительно, с другими некоторыми работает.



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
14-1105968533
Layner
2005-01-17 16:28
2005.02.06
Патчи к своей программе.


14-1105778142
Шишкин Илья
2005-01-15 11:35
2005.02.06
delphibase.endimus.ru


14-1105952259
Layner
2005-01-17 11:57
2005.02.06
Кто нибудь пишет DVD?


1-1106386713
Sicilla
2005-01-22 12:38
2005.02.06
Кодирование темы в письме e-mail


1-1106489931
saNat
2005-01-23 17:18
2005.02.06
Пишу свой класс. Прошу рекомендации, замечания