Главная страница
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.012 c
3-31645
toxa
2002-09-19 20:29
2002.10.10
Связь 3-х таблиц в IBase


1-31744
Magic
2002-10-01 13:53
2002.10.10
Тултипы


14-31984
Cobalt
2002-09-13 19:13
2002.10.10
Поиск в MSDN


14-31943
Николай Быков
2002-09-12 19:01
2002.10.10
Как правильно пить?


1-31714
Petrovich(Flame)
2002-10-01 02:34
2002.10.10
Чтение строкового параметра из ключа реестра! Помогите