![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CoInitialize + CoUninitialize
hexone © (2004-04-26 15:19:00)Добрый день.
Объясните мне, плиз, баг сие али нет.
* Консольное приложение вариант 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.
hexone (2004-04-26 17:31:00) [1]Да, действительно, с другими некоторыми работает.
clickmaker (2004-04-26 16:45:00) [2]
> hexone © (26.04.04 16:28) [6]
У меня такой код (с другими интерфейсам, ессессно) работает без AV
hexone (2004-04-26 16:28:00) [3]
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:21:00) [4]
> hexone © (26.04.04 16:15) [4]
> Присвоение nil глобальной переменной избавляет от бага по
> НЕУНИЧТОЖЕНИЮ объекта интерфейса заданного как глобальная
> переменная
Это как, интересно? У тебя оно приводит как раз таки к AV. Не веришь - убери да посмотри
hexone (2004-04-26 16:15:00) [5]
> Хм... Не заметил сразу, убери присвоение nil в объявлении
> test. Во-первых, незачем - он и так nil, а потом - это безграмотно,
> поскольку присвоение nil интерфейсному указателю в обжект
> паскале означает освобождение интерфейса
Присвоение nil глобальной переменной избавляет от бага по НЕУНИЧТОЖЕНИЮ объекта интерфейса заданного как глобальная переменная. Да и вообщем нет разницы. Если я в конце напишу test:=nil или в начале в объявлении. Причем с test:=nil также не работает.
> а потом - это безграмотно, поскольку присвоение nil интерфейсному
> указателю в обжект паскале означает освобождение интерфейса
Вот уж нет. Оно означает вызов Release, но не факт, что освобождение объекта.
clickmaker (2004-04-26 15:49:00) [6]Хм... Не заметил сразу, убери присвоение nil в объявлении test. Во-первых, незачем - он и так nil, а потом - это безграмотно, поскольку присвоение nil интерфейсному указателю в обжект паскале означает освобождение интерфейса
hexone (2004-04-26 15:27:00) [7]Exception выдает CoUnitialize, код я привел для примера.
clickmaker (2004-04-26 15:25:00) [8]
> hexone © (26.04.04 15:19)
А смысл: создать ком-объект и тут же CoUnitialize ? Ну если уж на то пошло:
CoInitialize;
try
test := CreateCOMObject(CLASS_TEST) as ITest;
if (test <> nil) then
test := nil;
finally
CoUninitialize;
end;