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

Вниз

COM, интерфейсы   Найти похожие ветки 

 
Walker ©   (2002-09-29 00:39) [0]

//есть такие переменные
var
hr : HRESULT;
pCreateDevEnum: ICreateDevEnum;
pEm: IEnumMoniker;

//далее я pCreateDevEnum инициируюю след. образом
begin
hr := CoCreateInstance(
CLSID_SystemDeviceEnum,
nil,
CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum,
pCreateDevEnum
);

//и произвожу кое-какие действия, например
if SUCCEEDED(hr) then
begin
hr := pCreateDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, pEm, 0);
if SUCCEEDED(hr) then
// тут цикл в котором я перечисляю Video Input устройства, а точнее получаю имя и индекс своего TV Tuner"a
// освобождаю pEm
pEm._Release;
end;
// освобождаю pCreateDevEnum
pCreateDevEnum._Relaese;
end;

так вот, собственно проблема:
если из кода убрать xxx._Relaese; то такой код выполняется без ошибок, а если ._Relaese оставить, то после
pEm._Release;
выскакивает ошибка:
================================
Microsoft Visual C++ Runtime Library
--------------------------------
Runtime Error!

Program: .....EXE
R025
-pure function call

--------------------------------

а если pEm._Release; внести в комментарий а pCreateDevEnum._Relaese; - вынести

выскакивает ошибка:
=====================================
Debugger Exception Nottification
-------------------------------------
Project xxx.exe raised exception class EAccessViolation with message "Access Violation at addr 010E2111". Read of addr FFFFFFFF. Process Stopped.....

-------------------------------------

Пример этот я перевёл из C++ напрямую в Delphi (в си - всё компилировалось и запускалось без ошибок)
Вопрос:
Хотелось бы понять как Делфи работает с переменными-интерфейсами (не с объектами типа TInterfacedObject), почему разработчики Делфи в IUnknown две фукции AddRef и Release переименовали соответственно в _AddRef и _Release, и как мне справится с ошибками.

(ICreateDevEnum - описан в DEVENUM.IDL)


 
Набережных С.   (2002-09-29 10:12) [1]

Убери релиз. Компилятор добавляет код, который сам вызовет Release при выходе переменной типа интерфейса из области видимости. В Delphi явно вызывать Release нужно только после явного вызова AddRef. Для того и переименовали, чтоб тебе показать - не вызывай не подумавши:)



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

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

Наверх




Память: 0.47 MB
Время: 0.045 c
7-32029
Ffaster
2002-07-31 01:29
2002.10.10
Как из своей проги запустить остановить Сервер удалённого доступа


1-31703
Anar
2002-09-30 14:55
2002.10.10
Image


1-31678
Андреев Павел
2002-09-30 14:42
2002.10.10
пустые properties


14-31999
Sniffer
2002-09-16 19:23
2002.10.10
С кем я общался


1-31689
Ago
2002-09-30 15:00
2002.10.10
ComboBox с иконками (рядом с выбираемыми значениями)