Что-то у меня подозрение, что по человечески это невозможно... Если не так буду рад ошибиться... Суть такая: есть дллка экспортирующая класс. Написана на VC++, так что есть хидер. Необходимо импортировать этот клас в проге на делфи.
Подскажите плиз как сделть это с минимумом извратов?
Здравствуйте, depressman, Вы писали:
D>Что-то у меня подозрение, что по человечески это невозможно... Если не так буду рад ошибиться... Суть такая: есть дллка экспортирующая класс. Написана на VC++, так что есть хидер. Необходимо импортировать этот клас в проге на делфи. D>Подскажите плиз как сделть это с минимумом извратов?
Скорее всего никак. Единственный вариант — написать обертку на C++ над этой длл — либо COM-сервер, либо обычную длл, экспортирующую все публичные методы класса и конструктор/деструктор.
Здесь это неоднократно обсуждалось — пользуйся поиском.
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, depressman, Вы писали:
D>>Что-то у меня подозрение, что по человечески это невозможно... Если не так буду рад ошибиться... Суть такая: есть дллка экспортирующая класс. Написана на VC++, так что есть хидер. Необходимо импортировать этот клас в проге на делфи. D>>Подскажите плиз как сделть это с минимумом извратов?
K>Скорее всего никак. Единственный вариант — написать обертку на C++ над этой длл — либо COM-сервер, либо обычную длл, экспортирующую все публичные методы класса и конструктор/деструктор.
Здравствуйте, kavlad, Вы писали:
OAB>>а почему бы просто интерфейсы+фабрика
K>Не совсем понял
ну описываешь интерфейс, реализуешь его на сях, дальше тебе нужно поднять реализацию этого интерфейса.
можно конечто наплодить кучу экспортируемых функций, а можно предусмотреть фабрику и одну экспортируемую функцию...
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>ну описываешь интерфейс, реализуешь его на сях, дальше тебе нужно поднять реализацию этого интерфейса. OAB>можно конечто наплодить кучу экспортируемых функций, а можно предусмотреть фабрику и одну экспортируемую функцию...
Вниметельнее смотрим мое сообщение Там первым вариантом идет COM-сервер.
Здравствуйте, kavlad, Вы писали:
OAB>>ну описываешь интерфейс, реализуешь его на сях, дальше тебе нужно поднять реализацию этого интерфейса. OAB>>можно конечто наплодить кучу экспортируемых функций, а можно предусмотреть фабрику и одну экспортируемую функцию...
K>Вниметельнее смотрим мое сообщение Там первым вариантом идет COM-сервер.
потому то у меня постоянно разногласия с народом раньше выходили, пока не показал!
интерфейс — это не ком! а ком — это конечно же интерфес
ком ассоциируется с разными завязками, регистрациями, версиями, лишними тормозами и т.д, а интерфейс — это всего лишь описатель.
Здравствуйте, kavlad, Вы писали:
K>JОК. Можно подробнее или ссылку?
нет много времени чтоб подробно...
в двух словах так:
1. на сях пишешь чистый абстрактный класс = интерфейс.
2. на делфях это получается record
3. с фабрикой все понятно
4. мапишь рекорд на то что вернула фабрика и работаешь
в догонку, статья которая по ходу ниже вызывает большие сомнения.
100% заточка на борландовый VCL.
интересно узнать, если класс будет собран VC, как это будет работать?
PS. может выкрою пол-часика — нарисую сюда фишку (если еще не рисовал)
OAB>1. на сях пишешь чистый абстрактный класс = интерфейс. OAB>2. на делфях это получается record OAB>3. с фабрикой все понятно OAB>4. мапишь рекорд на то что вернула фабрика и работаешь
э-э ... а если просто перечитать исходный пост ?
OAB>в догонку, статья которая по ходу ниже вызывает большие сомнения.
какого рода сомнения ?
OAB>100% заточка на борландовый VCL. об чём речь от здесь
OAB>интересно узнать, если класс будет собран VC, как это будет работать?
там (на сайте) есть отдельная статья и просто про с (без плюсов)
Здравствуйте, Daedalus, Вы писали:
OAB>>1. на сях пишешь чистый абстрактный класс = интерфейс. OAB>>2. на делфях это получается record OAB>>3. с фабрикой все понятно OAB>>4. мапишь рекорд на то что вернула фабрика и работаешь D>э-э ... а если просто перечитать исходный пост ?
1) если просто перечитать — то есть класс в DLL скомпиленной на VC и этот класс надо заюзать в делфях.
OAB>>в догонку, статья которая по ходу ниже вызывает большие сомнения. D>какого рода сомнения ?
по поводу юзабельности пункта перечитать 1.
OAB>>100% заточка на борландовый VCL. D> об чём речь от здесь
ты вообще в курсе о четырех байтах перед Self, которые указывают на класс?
OAB>>интересно узнать, если класс будет собран VC, как это будет работать? D>там (на сайте) есть отдельная статья и просто про с (без плюсов)
а если перечитать исходный пост? какие классы на С?
мне вообщет смешно смотреть когда люди классы пытаются завернуть в функции! легче на Си++ перейти чем такой изврат писать.
тут наоборот над читым API обвертки для классов пишут!!! деградация какая-то...
Здравствуйте, Lepsik, Вы писали:
OAB>>100% заточка на борландовый VCL. OAB>>интересно узнать, если класс будет собран VC, как это будет работать?
L>я делал wrapper для VC6 dll + stl — переводил все на чиcтые struct с занятием и высвобождением памяти внутри dll
а я пиво вчера пил, но какое отношение это имеет к рассматриваемой теме? какие враперы? о враперах уже говорили! мы о маперах говорим!
чебят, чесслово, это ж неуважение не прочитав о чем идет речь вставить свои 5 коппек.
Вот такая идея родилась. В той длл-ке экспортируется кроме класса ещё и экземпляр этого класса, через который и надо работать. Так вот делаем в новой длл-ке на VC функции, выхывающие методы, и функции чтения/записи полей. После подцепляем это хозяйство как external к методам и гетерам/сетерам пропертисов аналогичного класса в Delphi. Получаем то что надо. но возникает проблема с передачей параметров. Вроде объявил и там и там функции как __cdecl/cdecl но параметры не передаются... В чем тут может быть дело подскажите?
Я понял в чем проблема, а вот как решить её вопрос остаётся открытым. Дело в том, что дэлфи при вызове методов класса передает в стэк не только параметры метода, но и ещё один параметр указатель на экземпляр класса. Вот его то и берет прога при cdecl в качестве первого параметра. При stdcall и других всё ещё хуже. Если очищать стек будет вызываемая процедура, то она не очистит его до конца, так как не считает, что параметров меньше. И в результате всё падает при stdcall.
Варианты, которые сейчас обдумываю:
— Сделать функции с переменным числом параметров (мне кажется не поможет)
— Сделать вставки на асме для изменения стека в процедуре (сейчас буду пробовать)
— Не извращатся и сделать вызов импорченой функции вместо привязки к методу (слишком просто и нудно
Собственно насчёт асма я погорячился. Там всё гораздо проще. Можно просто сдвинуть параметры на 1. То есть если есть например 2 параметра a и b то будет что-то вроде:
int __cdecl Foo(int a,int b){
a = *(&a + 1);
*(&a + 1) = *(&a + 2); // или b = *(&b + 1);
//...
}
Конечно это изврат... Но помогает.
Естественно при этом указатель на объект — экземпляр класса затирается. Но, я думаю, он используется только для this, а это мне без надобности. Хотя кто его знает .
ЗЫ А по человечески — это делать нормальные вызовы, а не замещения из импорта...
Здравствуйте, depressman, Вы писали:
D>Я понял в чем проблема, а вот как решить её вопрос остаётся открытым. Дело в том, что дэлфи при вызове методов класса передает в стэк не только параметры метода, но и ещё один параметр указатель на экземпляр класса. Вот его то и берет прога при cdecl в качестве первого параметра. При stdcall и других всё ещё хуже. Если очищать стек будет вызываемая процедура, то она не очистит его до конца, так как не считает, что параметров меньше. И в результате всё падает при stdcall.
А ты не пробовал использовать на обоих концах одинаковые конвенции?
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.