Королевство Дельфи"Knowledge itself is power"
F.Bacon
 Лицей
  
Главная
О лицее

Список семинаров

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  05:39[Войти] | [Зарегистрироваться]

Обсуждение материала
Глава 6. Интерфейсы
Полный текст материала


Другие публикации автора: Кирилл Сурков

Цитата или краткий комментарий:

«... При программировании нередко возникает необходимость выполнить обращение к объекту, находящемуся в другом загрузочном модуле, например EXE или DLL. Для решения поставленной задачи компания Microsoft разработала технологию COM (Component Object Model) — компонентную модель объектов. Согласно технологии COM взаимодействие между объектами осуществляется посредством так называемых интерфейсов. Рассмотрим, что же они собой представляют и как с ними работают. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.




Смотрите также материалы по темам:
[Интерфейсы COM-объектов]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 9

25-01-2007 05:34
Здравствуйте!
Хотелось бы узнать, почему нет продолжения данной книги. Спасибо.


24-01-2007 12:13
Спасибо Erik Ivanov за вашу строку :)
ISqlIntf := nil; //Вот эта строка!
Я никак не мог понять,
почему у меня при вызове FreeLibrary вылетиал exception.
Ща попробую, передать в интерфейс в качестве out-парамеира процедуры...


20-03-2006 09:02
Я проверил данный подход на Delphi 5 Windows 2000. Если недобавить одну строку, то возникает Access Violation!
  ISqlIntf := AccountInterface;
  Result := ISqlIntf.UpdateAccount(ViiteNr, Value);
  ISqlIntf := nil; //Вот эта строка!


03-03-2006 01:48
Расскажу об опыте практической реализации связки приложений на Delphi и С++.
Оказывается не все так просто, как кажется на первый взгляд.
Существует ряд неписанных правил, которые нигде не оговорены, но без их соблюдения диалог разноязыковых программ невозможен.

1)
  Нельзя писать следующее объявление метода интерфейса:
  function GetItem: IMyItem; stdcall;
  Писать необходимо так:
  procedure GetItem(out AItem: IMyItem); stdcall;
  
  Эта проблема возникает от того, что Delphi проталкивает в стек указатель на интерфейс и вызывает функцию. Тогда как С++ не берет указатель из стека и не меняет его значение, а возвращает указатель на интерфейс в регистре EAX.
  По правилам вызовов stdcall C++ прав. Но так или иначе ни структуры (record в паскале) ни интерфейсы нельзя передовать как результат функции.

2)
  Нельзя писать следующее объявление метода интерфейса:
  procedure GetItem(var AItem: IMyItem); stdcall;
  Писать необходимо так:
  procedure GetItem(out AItem: IMyItem); stdcall;

  Именно out, а не var, так как С++ ничего не инициализирует и в указателе на переменную AItem может быть мусор, а Delphi обязательно попытается вызвать у мусора Release, чем и вызовет сбой программы.

Может это и не все причуды реализации COM, но рассказал про то с чем имел дело.


25-02-2006 04:32
А копирование здесь не при чём. Вот хорошо, что это сказали.


24-02-2006 11:31
сообщение от автора материала
Верно, ShareMem не нужен. Спасибо, что поправили.


24-02-2006 10:55
>>> верно ли будет утверждение: "Если использовать не string, а widestring, и без sharemem, то никаких AV не будет, так как Delphi, передавая widestring другой переменной, полностью её туда копирует."?

ShareMem решает проблемы, связанные с тем, что в EXE и DLL разные менеджеры памяти, и когда один из них пытается освободить то, что выделил другой, лезут ошибки. Но WideString - это обёртка над системным BSTR, в целях совместимости с COM/DCOM память для этого типа выделяется и освобождвется через API-функции SysAllocString, SysFreeString и т.п., т.е. менеджер памяти Delphi в этом процессе не участвует. Получается, что DLL и EXE для работы с WideString используют один и тот же системный менеджер памяти, поэтому ShareMem здесь не нужен. А копирование здесь не при чём.


23-02-2006 07:08
сообщение от автора материала
Тем не менее, ShareMem нужно подключить, поскольку DLL-библиотека имеет право освободить строку, выделенную EXE-программой (и наоборот). Если же строки передаются лишь как входные пераметры (т.е. DLL-библиотека их не возвращает), то при использовании WideString можно обойтись и без ShareMem.


23-02-2006 06:48
Аторам: Вы объявили интерфейс
type
  ITextReader = interface
и пообещали, что с ним можно работать в dll, кажется я ничего не пропустил, но вы не дали сноску по поводу как работать с string (правда это есть в предыдущей статье), а так выскочит AV.

И вопрос: верно ли будет утверждение: "Если использовать не string, а widestring, и без sharemem, то никаких AV не будет, так как Delphi, передавая widestring другой переменной, полностью её туда копирует."?


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Зимой — белый, летом — серый. Кто?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования