Главная страница
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.015 c
1-31805
mmb
2002-10-02 11:15
2002.10.10
Создать настраиваемый Toolbar с помощью какого компонента лучше?


3-31600
Brestmarket.com
2002-09-18 15:52
2002.10.10
Access violation at address ... rtl60.bpl


14-32006
qwerty123x
2002-09-16 12:38
2002.10.10
Сколько стоит заказать сантехника? (я имею в виду услуги киллера)


14-31968
RV
2002-09-16 10:53
2002.10.10
Чем смотреть файлы *.odf


4-32099
Azbul
2002-08-23 08:06
2002.10.10
Помогите с отключением клавы и мыши