Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема использования интерфейса Delphi в CBulder 
:(
    Опции темы
SergSW
Дата 26.8.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Суть такова есть класс TIMyInter реализующий мой интерфейс IMyInter. Реализация класса и код создающий экземпляр класса вынесен в DLL.
Код

IMyInter = interface(IInterface)
...
    function AddItem(iType: Integer; iX, iY: Integer): IItem; stdcall;
...

п.с. IItem так же мой интерфейс реализуемый в этой библиотеке.

На Delphi пример работает на ура вызов проходит без ошибок, но тоже самое на CBilder-e валится в AV, причём проблема именно в том что я возвращаю IItem, т.к. прочие методы рабоают и в билдере

интерфейс на Сях
Код

interface __declspec(uuid("{6854C2C5-3411-41F3-AD2B-A1666CAF33B5}")) IMyInter: public IUnknown
...
virtual IItem* __stdcall AddItem(int iType, int iX, int iY) = 0;


под отладчиком увидел интересный момент (Пример Delphi)
Код

MainF.pas.344: FObj.AddItem(FAddType, X, Y);
004816BA 8B4508           mov eax,[ebp+$08]
004816BD 50               push eax // помещаем в стек Y
004816BE 8B450C           mov eax,[ebp+$0c]
004816C1 50               push eax // помещаем в стек X
004816C2 8B45FC           mov eax,[ebp-$04]
004816C5 8B8038030000     mov eax,[eax+$00000338]
004816CB 50               push eax // помещаем в стек FAddType
004816CC 8B45FC           mov eax,[ebp-$04]
004816CF 8B8034030000     mov eax,[eax+$00000334]
004816D5 50               push eax // помещаем в стек Self
004816D6 8D55F0           lea edx,[ebp-$10]
004816D9 52               push edx // похоже что тут в стек помещается ссылка на интерфейсный объект
004816DA 8B00             mov eax,[eax]
004816DC FF503C           call dword ptr [eax+$3c]


вызов того же метода (Пример CBuilder)
Код

MainF.cpp.88: FObj->AddItem(iType, X, Y);
004025C9 FF7508           push dword ptr [ebp+$08] // помещаем в стек Y
004025CC FF750C           push dword ptr [ebp+$0c] // помещаем в стек X
004025CF FF359CE14200     push dword ptr [$0042e19c] // помещаем в стек iType
004025D5 A198E14200       mov eax,[$0042e198]
004025DA 50               push eax // помещаем в стек Self
004025DB 8B10             mov edx,[eax]
004025DD FF523C           call dword ptr [edx+$3c]

Как видно в случае с CBuilder-ом иной список параметров помещаемых в стек. При этом везде должна идти передача параметров по stdcall как добиться единообразия?

Это сообщение отредактировал(а) SergSW - 26.8.2009, 18:18
PM   Вверх
Romikgy
Дата 26.8.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(SergSW @  26.8.2009,  17:16 Найти цитируемый пост)
function AddItem(iType: Integer; iX, iY: Integer): IItem; stdcall;


Цитата(SergSW @  26.8.2009,  17:16 Найти цитируемый пост)
virtual IItem* __stdcall AddItem(int iType, int iX, int iY) = 0;

а че разные вызовы? зачем виртуал в си варианте? тем более сделаный абстрактным?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
SergSW
Дата 26.8.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Цитата(Romikgy @  26.8.2009,  21:46 Найти цитируемый пост)
а че разные вызовы?

В чём на Ваш взгляд они разные?

Цитата(Romikgy @  26.8.2009,  21:46 Найти цитируемый пост)
зачем виртуал в си варианте? 

Насколько я помню все методы интерфейсов являются виртуальными. Т.к. все точки входов методов должны размещаться в VTM

Цитата(Romikgy @  26.8.2009,  21:46 Найти цитируемый пост)
тем более сделаный абстрактным?

это интерфейс - у него нет реализации на C

PM   Вверх
CodeMonkey
Дата 26.8.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Я ничего не понимать в сях, но

Код

function AddItem(iType: Integer; iX, iY: Integer): IItem; stdcall;


Неявно трактуется как:

Код

procedure AddItem(iType: Integer; iX, iY: Integer; out Result: IItem); stdcall;


Может это поможет.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
SergSW
Дата 27.8.2009, 04:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



CodeMonkey, не знал )), спасибо за совет - попробую

эх теперь бы ещё перевезти
Код

procedure AddItem(iType: Integer; iX, iY: Integer; out Result: IItem); stdcall;

на C

Это сообщение отредактировал(а) SergSW - 27.8.2009, 08:20
PM   Вверх
CodeMonkey
Дата 27.8.2009, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



А откуда взялся вариант интерфейса для C++?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
SergSW
Дата 27.8.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Цитата(CodeMonkey @ 27.8.2009,  10:30)
А откуда взялся вариант интерфейса для C++?

простите не понял вопроса
PM   Вверх
Alexeis
Дата 27.8.2009, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(SergSW @  27.8.2009,  07:35 Найти цитируемый пост)
простите не понял вопроса 

  Был ли он сгенерирован средой или же написан самостоятельно руками.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
SergSW
Дата 27.8.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Цитата(Alexeis @  27.8.2009,  11:17 Найти цитируемый пост)
  Был ли он сгенерирован средой или же написан самостоятельно руками.

был написан самостоятельно - руками
PM   Вверх
Alexeis
Дата 27.8.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Вот так будет правильно

Код

__interface IMyInter;
typedef System::DelphiInterface<IMyInter> _di_IMyInter;
__interface IMyInter  : public IInterface 
{
    
public:
    virtual IItem* __stdcall AddItem(int iType, int iX, int iY) = 0 ;
};


Добавлено через 1 минуту и 49 секунд
  Просто добавляешь модуль делфи в проект билдера, и билдер сам генерит совместимые хидеры.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
SergSW
Дата 27.8.2009, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



но будет ли он корректно работать на VS? Сомневаюсь

Это сообщение отредактировал(а) SergSW - 27.8.2009, 10:08
PM   Вверх
Romikgy
Дата 27.8.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(SergSW @  27.8.2009,  03:36 Найти цитируемый пост)
procedure AddItem(iType: Integer; iX, iY: Integer; out Result: IItem); stdcall;

иль так
Код

void __stdcall AddItem(int iType, int iX, int iY, IItem *Result);

иль так
Код

void __stdcall AddItem(int iType, int iX, int iY, IItem &Result);

имхо

Это сообщение отредактировал(а) Romikgy - 27.8.2009, 10:20


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 27.8.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(SergSW @  27.8.2009,  09:07 Найти цитируемый пост)
но будет ли он корректно работать на VS? Сомневаюсь

  Нет конечно, нужно просто разбираться что VS понимает под словом interface.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
SergSW
Дата 27.8.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Romikgy, увы но не так. Видимо несовсем внимательно читали мой код. То что выпредлогаете первым в стек засунет Result, затем Y, X, Type и this(Self) а в делфи получается порядок другой Y, X, Type, this(Self), Result несмотря на то что везде стоит вызов stdcall.

Цитата(Alexeis @  27.8.2009,  13:50 Найти цитируемый пост)
 Нет конечно, нужно просто разбираться что VS понимает под словом interface.


да вроде бы это везде абстрактные классы) Проблема возникает в передачи параметров при возврате интерфейсного объекта.

Для себя решил что проще явно переделать методы

Код

function AddItem(iType: Integer; iX, iY: Integer; var ResItem: IItem): BOOL; stdcall;


по крайней мере должно везде заработать, жаль что много переписывать придётся  smile 

PM   Вверх
Alexeis
Дата 27.8.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(SergSW @  27.8.2009,  11:32 Найти цитируемый пост)
да вроде бы это везде абстрактные классы)

  А кто гарантирует что структура VMT у них совпадает?

Добавлено через 32 секунды
  По идее делфи дает COM совместимые интерфейсы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0661 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.