Использование классов из dll в Delphi
От: depressman  
Дата: 03.05.05 20:10
Оценка:
Что-то у меня подозрение, что по человечески это невозможно... Если не так буду рад ошибиться... Суть такая: есть дллка экспортирующая класс. Написана на VC++, так что есть хидер. Необходимо импортировать этот клас в проге на делфи.
Подскажите плиз как сделть это с минимумом извратов?
Re: Использование классов из dll в Delphi
От: kavlad Россия http://www.wavesoft.ru
Дата: 04.05.05 05:28
Оценка:
Здравствуйте, depressman, Вы писали:

D>Что-то у меня подозрение, что по человечески это невозможно... Если не так буду рад ошибиться... Суть такая: есть дллка экспортирующая класс. Написана на VC++, так что есть хидер. Необходимо импортировать этот клас в проге на делфи.

D>Подскажите плиз как сделть это с минимумом извратов?

Скорее всего никак. Единственный вариант — написать обертку на C++ над этой длл — либо COM-сервер, либо обычную длл, экспортирующую все публичные методы класса и конструктор/деструктор.
Здесь это неоднократно обсуждалось — пользуйся поиском.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[2]: Использование классов из dll в Delphi
От: Oleg A. Bachin Украина  
Дата: 04.05.05 12:43
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, depressman, Вы писали:


D>>Что-то у меня подозрение, что по человечески это невозможно... Если не так буду рад ошибиться... Суть такая: есть дллка экспортирующая класс. Написана на VC++, так что есть хидер. Необходимо импортировать этот клас в проге на делфи.

D>>Подскажите плиз как сделть это с минимумом извратов?

K>Скорее всего никак. Единственный вариант — написать обертку на C++ над этой длл — либо COM-сервер, либо обычную длл, экспортирующую все публичные методы класса и конструктор/деструктор.


а почему бы просто интерфейсы+фабрика
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[3]: Использование классов из dll в Delphi
От: kavlad Россия http://www.wavesoft.ru
Дата: 04.05.05 13:09
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>а почему бы просто интерфейсы+фабрика


Не совсем понял
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[4]: Использование классов из dll в Delphi
От: Oleg A. Bachin Украина  
Дата: 04.05.05 15:21
Оценка:
Здравствуйте, kavlad, Вы писали:

OAB>>а почему бы просто интерфейсы+фабрика


K>Не совсем понял


ну описываешь интерфейс, реализуешь его на сях, дальше тебе нужно поднять реализацию этого интерфейса.
можно конечто наплодить кучу экспортируемых функций, а можно предусмотреть фабрику и одну экспортируемую функцию...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re: Использование классов из dll в Delphi
От: Daedalus Гондурас http://www.rikt.ru/~daedal
Дата: 04.05.05 15:41
Оценка: 23 (4)
глянь великолепную статью с примером

http://rvelthuis.bei.t-online.de/articles/articles-cppobjs.htm
Re[5]: Использование классов из dll в Delphi
От: kavlad Россия http://www.wavesoft.ru
Дата: 05.05.05 05:16
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>ну описываешь интерфейс, реализуешь его на сях, дальше тебе нужно поднять реализацию этого интерфейса.

OAB>можно конечто наплодить кучу экспортируемых функций, а можно предусмотреть фабрику и одну экспортируемую функцию...

Вниметельнее смотрим мое сообщение Там первым вариантом идет COM-сервер.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[6]: Использование классов из dll в Delphi
От: Oleg A. Bachin Украина  
Дата: 05.05.05 07:08
Оценка:
Здравствуйте, kavlad, Вы писали:

OAB>>ну описываешь интерфейс, реализуешь его на сях, дальше тебе нужно поднять реализацию этого интерфейса.

OAB>>можно конечто наплодить кучу экспортируемых функций, а можно предусмотреть фабрику и одну экспортируемую функцию...

K>Вниметельнее смотрим мое сообщение Там первым вариантом идет COM-сервер.


потому то у меня постоянно разногласия с народом раньше выходили, пока не показал!
интерфейс — это не ком! а ком — это конечно же интерфес
ком ассоциируется с разными завязками, регистрациями, версиями, лишними тормозами и т.д, а интерфейс — это всего лишь описатель.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[7]: Использование классов из dll в Delphi
От: kavlad Россия http://www.wavesoft.ru
Дата: 05.05.05 07:31
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

JОК. Можно подробнее или ссылку?
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[8]: Использование классов из dll в Delphi
От: Oleg A. Bachin Украина  
Дата: 05.05.05 14:22
Оценка: 1 (1)
Здравствуйте, kavlad, Вы писали:

K>JОК. Можно подробнее или ссылку?


нет много времени чтоб подробно...
в двух словах так:
1. на сях пишешь чистый абстрактный класс = интерфейс.
2. на делфях это получается record
3. с фабрикой все понятно
4. мапишь рекорд на то что вернула фабрика и работаешь

в догонку, статья которая по ходу ниже вызывает большие сомнения.
100% заточка на борландовый VCL.
интересно узнать, если класс будет собран VC, как это будет работать?

PS. может выкрою пол-часика — нарисую сюда фишку (если еще не рисовал)
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[9]: Использование классов из dll в Delphi
От: kavlad Россия http://www.wavesoft.ru
Дата: 05.05.05 14:50
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

Понятно. Только рекорд — как-то уж не совсем красиво
Но в целом это хоть какой-то выход.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[9]: Использование классов из dll в Delphi
От: Daedalus Гондурас http://www.rikt.ru/~daedal
Дата: 05.05.05 15:03
Оценка:
OAB>1. на сях пишешь чистый абстрактный класс = интерфейс.
OAB>2. на делфях это получается record
OAB>3. с фабрикой все понятно
OAB>4. мапишь рекорд на то что вернула фабрика и работаешь
э-э ... а если просто перечитать исходный пост ?

OAB>в догонку, статья которая по ходу ниже вызывает большие сомнения.

какого рода сомнения ?

OAB>100% заточка на борландовый VCL.

об чём речь от здесь

OAB>интересно узнать, если класс будет собран VC, как это будет работать?

там (на сайте) есть отдельная статья и просто про с (без плюсов)
Re[10]: Использование классов из dll в Delphi
От: Oleg A. Bachin Украина  
Дата: 05.05.05 15:24
Оценка:
Здравствуйте, 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 обвертки для классов пишут!!! деградация какая-то...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[2]: Использование классов из dll в Delphi
От: depressman  
Дата: 05.05.05 20:12
Оценка:
Здравствуйте, Daedalus, Вы писали:

D>глянь великолепную статью с примером


D>http://rvelthuis.bei.t-online.de/articles/articles-cppobjs.htm


Сэнкс. Суперская статья.
Re[9]: Использование классов из dll в Delphi
От: Lepsik Гондурас https://www.kirdyk.club/
Дата: 06.05.05 17:42
Оценка:
OAB>100% заточка на борландовый VCL.
OAB>интересно узнать, если класс будет собран VC, как это будет работать?

я делал wrapper для VC6 dll + stl — переводил все на чиcтые struct с занятием и высвобождением памяти внутри dll
Re[10]: Использование классов из dll в Delphi
От: Oleg A. Bachin Украина  
Дата: 10.05.05 11:30
Оценка:
Здравствуйте, Lepsik, Вы писали:

OAB>>100% заточка на борландовый VCL.

OAB>>интересно узнать, если класс будет собран VC, как это будет работать?

L>я делал wrapper для VC6 dll + stl — переводил все на чиcтые struct с занятием и высвобождением памяти внутри dll


а я пиво вчера пил, но какое отношение это имеет к рассматриваемой теме? какие враперы? о враперах уже говорили! мы о маперах говорим!
чебят, чесслово, это ж неуважение не прочитав о чем идет речь вставить свои 5 коппек.

PS а врапер на что угодно можно сделать...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re: Использование классов из dll в Delphi
От: depressman  
Дата: 10.05.05 18:30
Оценка:
Вот такая идея родилась. В той длл-ке экспортируется кроме класса ещё и экземпляр этого класса, через который и надо работать. Так вот делаем в новой длл-ке на VC функции, выхывающие методы, и функции чтения/записи полей. После подцепляем это хозяйство как external к методам и гетерам/сетерам пропертисов аналогичного класса в Delphi. Получаем то что надо. но возникает проблема с передачей параметров. Вроде объявил и там и там функции как __cdecl/cdecl но параметры не передаются... В чем тут может быть дело подскажите?
Re[2]: Использование классов из dll в Delphi
От: depressman  
Дата: 10.05.05 20:52
Оценка: :)))
Я понял в чем проблема, а вот как решить её вопрос остаётся открытым. Дело в том, что дэлфи при вызове методов класса передает в стэк не только параметры метода, но и ещё один параметр указатель на экземпляр класса. Вот его то и берет прога при cdecl в качестве первого параметра. При stdcall и других всё ещё хуже. Если очищать стек будет вызываемая процедура, то она не очистит его до конца, так как не считает, что параметров меньше. И в результате всё падает при stdcall.
Варианты, которые сейчас обдумываю:
— Сделать функции с переменным числом параметров (мне кажется не поможет)
— Сделать вставки на асме для изменения стека в процедуре (сейчас буду пробовать)
— Не извращатся и сделать вызов импорченой функции вместо привязки к методу (слишком просто и нудно
Re[3]: Использование классов из dll в Delphi
От: depressman  
Дата: 10.05.05 22:01
Оценка:
Собственно насчёт асма я погорячился. Там всё гораздо проще. Можно просто сдвинуть параметры на 1. То есть если есть например 2 параметра a и b то будет что-то вроде:
int __cdecl Foo(int a,int b){
    a = *(&a + 1);
    *(&a + 1) = *(&a + 2); // или b = *(&b + 1);
    //...
}

Конечно это изврат... Но помогает.
Естественно при этом указатель на объект — экземпляр класса затирается. Но, я думаю, он используется только для this, а это мне без надобности. Хотя кто его знает .
ЗЫ А по человечески — это делать нормальные вызовы, а не замещения из импорта...
Re[3]: Использование классов из dll в Delphi
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.05.05 04:08
Оценка:
Здравствуйте, depressman, Вы писали:

D>Я понял в чем проблема, а вот как решить её вопрос остаётся открытым. Дело в том, что дэлфи при вызове методов класса передает в стэк не только параметры метода, но и ещё один параметр указатель на экземпляр класса. Вот его то и берет прога при cdecl в качестве первого параметра. При stdcall и других всё ещё хуже. Если очищать стек будет вызываемая процедура, то она не очистит его до конца, так как не считает, что параметров меньше. И в результате всё падает при stdcall.

А ты не пробовал использовать на обоих концах одинаковые конвенции?
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.