И как всё-таки получить интерфейс на С++?

Все что касается разработки, отладки, использования подключаемых модулей.

Moderators: Korney San, marcipan

Post Reply
ukc
Posts: 5
Joined: 31 Oct 2006, 15:55 Tue
Contact:

И как всё-таки получить интерфейс на С++?

Post by ukc »

Т.е. ума не приложу, как должна выглядеть сигнатура функций?
Представленные в api объявления совсем не похожи на COM, как их правильно сконвертировать?

Методом тыка (пытаясь загрузить плагин плагин планировщика) нашел сигнатуру для экспортируемой функции

Code: Select all

HRESULT _stdcall RegisterPlugIn (IDMPlugIn**);
Т.е. возвращает значение функция всё же в один из своих параметров.
AddRef и Release у полученного интерфейса вызываются, по крайней мере, без проблем =). Но как быть с другими?
Подскажите, хотя бы, доку по реализации делфёй разных соглашений о вызове, а?
~~~~~~~~~~~~~~~Чуть позже~~~~~~~~~~~~~~~~~~~~
Доку нашел
Есть успехи. Блин, оказывается указатель (ссылка) на место, в которое нужно записать Result передается ДО указателя (ссылки) на интерфейс, что всяко противоречит принятым в C++ соглашениям. Интерфейс будет (если не обхарит) на C. Надо кому?
ukc
Posts: 5
Joined: 31 Oct 2006, 15:55 Tue
Contact:

Post by ukc »

Очень хочется попросить разработчиков прислушаться к этим советам, при разработке новых API:
Расскажу об опыте практической реализации связки приложений на 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, но рассказал про то с чем имел дело.

Слава
Про причину проблемы автор немного напутал (проблема в том, что следом за проталкиванием в стек указателя на интерфейс, делфи заталкивает туда адрес указателя на результат (которого именно там быть не должно)).
Второе обходится аккуратным программированием плагина. Но зачем усложнять.
Есть пример написания плагина в MSVS/VC8 (всё-же на С++). Если кому нужен - велкам в приват или аську.
Атех
Posts: 1
Joined: 02 Nov 2006, 6:58 Thu

Post by Атех »

ukc wrote: Есть пример написания плагина в MSVS/VC8 (всё-же на С++). Если кому нужен - велкам в приват или аську.
Опубликуйте пример прямо здесь, если Вам не сложно.
ukc
Posts: 5
Joined: 31 Oct 2006, 15:55 Tue
Contact:

Post by ukc »

-=Vd=-
Posts: 1
Joined: 22 Nov 2005, 14:08 Tue
Contact:

Post by -=Vd=- »

Спасибо, сам ковырял - ничего не получилось. Попробую заюзать.
aldari
Опытный
Posts: 39
Joined: 22 May 2007, 22:58 Tue

Post by aldari »

Спасибо I like C++ :D :lol: 8) :D :)
aldari
Опытный
Posts: 39
Joined: 22 May 2007, 22:58 Tue

Post by aldari »

Может быть усилием воли в версии 3.5 поправить интерфейс плагинов.
А код на С++ обязательно нужно выложить рядом с Delphi.
Правда в без поправок он несколько больше Delphi, что и понятно.
JPooh
Posts: 2
Joined: 30 Oct 2008, 4:35 Thu

Post by JPooh »

если у кого есть, выложите пример плагина на C++ пжалста,
ссылка товарисча ukc к сожалению сдохла.
лучше всего для BCB6... но пойдет и для VC конечно.
Alex Qwerty
Гуру
Posts: 175
Joined: 16 Jun 2007, 8:56 Sat

Post by Alex Qwerty »

XPProSP2, DM 5.6.1.1187, Opera 10.10.1893, oGet
JPooh
Posts: 2
Joined: 30 Oct 2008, 4:35 Thu

Post by JPooh »

Премного вам благодарен, уважаемый Alex-гуру. :)
Post Reply