 |  | |  | |
Полный текст материала
Другие публикации автора: Кирилл Сурков
Цитата или краткий комментарий: «... При программировании нередко возникает необходимость выполнить обращение к объекту, находящемуся в другом загрузочном модуле, например EXE или DLL. Для решения поставленной задачи компания Microsoft разработала технологию COM (Component Object Model) — компонентную модель объектов.
Согласно технологии COM взаимодействие между объектами осуществляется посредством так называемых интерфейсов. Рассмотрим, что же они собой представляют и как с ними работают. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
[Интерфейсы COM-объектов]
Отслеживать это обсуждение 
Всего сообщений: 925-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 другой переменной, полностью её туда копирует."? |
|
|
|