Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.01 c
3-31602
BD
2002-09-18 20:10
2002.10.10
Как создать новую базу данных на Access e через ADO.


14-32017
Ш-К
2002-09-17 18:18
2002.10.10
Глюк какой-то странный.


3-31586
Pavel Denisov
2002-09-18 10:42
2002.10.10
DBGrid скроллинг


1-31741
22606
2002-10-01 12:21
2002.10.10
как узнать абсолютное значение Rect для ячейки Grid


1-31850
Romikadze
2002-09-28 17:57
2002.10.10
Название песни, которую играет winamp




   Наверх