Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.03 c
4-32095
PaRL
2002-08-27 19:58
2002.10.10
Текст


1-31858
Walker
2002-09-29 00:39
2002.10.10
COM, интерфейсы


1-31720
Dmitry Toropov
2002-10-01 09:49
2002.10.10
ADO, auto increment field


1-31800
k
2002-10-01 17:19
2002.10.10
bb


14-32000
совсем Новенький
2002-09-17 10:55
2002.10.10
Акумулятор к UPS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский