Использование классов из 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Использование классов из dll в Delphi
От: depressman  
Дата: 11.05.05 15:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>А ты не пробовал использовать на обоих концах одинаковые конвенции?


Так разве __cdecl в VC и cdecl в delphi не одно и то же? А про stdcall я имел ввиду, что и там и там поменял, естественно.
Re: Использование классов из dll в Delphi
От: aswSoft http://aswsoft.hoha.ru
Дата: 11.05.05 16:55
Оценка:
Здравствуйте, depressman!

DLL не может экспортировать классы в каком то нормальном виде. Она экспортирует функции. Это в VC++ добавили какие то свои навороты. Но для импорта таких классов необходим .lib файл, сделанный при сборке DLL. Он там обворачивает функции, оставляя их реализацию внутри. Т.е. без извратов вообще не обойдешся.

Прежде чем что-то советовать хотелось бы узнать, исходники DLL есть или нет? Есть ли возможность ее изменить? Если ДА, то были дельные советы по использованию ИНТЕРФЕЙСОВ! Если DLL неприкасаема, то надо думать и смотреть каким образом VC сводит вызов методов класса к вызову функций DLL. В последнем случае сразу не соображу щас) Но думаю направление не тупиковое)

Удачи!
Re[5]: Использование классов из dll в Delphi
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.05.05 08:52
Оценка:
Здравствуйте, depressman, Вы писали:
D>Так разве __cdecl в VC и cdecl в delphi не одно и то же? А про stdcall я имел ввиду, что и там и там поменял, естественно.
Я не понял, почему вызываемая процедура думает, что параметров меньше. Ты что, полагаешь, что в VC++ this каким-то волшебным образом передается? При одинаковых конвенциях все должно быть одинаково. Причем безопаснее не пользоваться fastcall и fastthis, т.к. они могут укладывать аргументы в регистры в разном порядке. stdcall и ccall должны полностью совпадать.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Использование классов из dll в Delphi
От: depressman  
Дата: 12.05.05 19:14
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Я не понял, почему вызываемая процедура думает, что параметров меньше. Ты что, полагаешь, что в VC++ this каким-то волшебным образом передается? При одинаковых конвенциях все должно быть одинаково. Причем безопаснее не пользоваться fastcall и fastthis, т.к. они могут укладывать аргументы в регистры в разном порядке. stdcall и ccall должны полностью совпадать.


В длл процедура описана как обычная процедура, а импортируется она к методу:
procedure Class.Method(a: integer; b: integer); cdecl; external 'mydll.dll' name 'MethodProcedure';

При вызове метода из дэлфи кроме обычных параметров передется еще и this. Вот и получается лишний параметр. Что-то вроде:
push 2
push 1
mov eax, [Exemp]
push eax
call Class.Method
Re[7]: Использование классов из dll в Delphi
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.05.05 03:37
Оценка:
Здравствуйте, depressman, Вы писали:

D>В длл процедура описана как обычная процедура, а импортируется она к методу:

D>
D>procedure Class.Method(a: integer; b: integer); cdecl; external 'mydll.dll' name 'MethodProcedure';
D>

D>При вызове метода из дэлфи кроме обычных параметров передется еще и this. Вот и получается лишний параметр. Что-то вроде:
D>
D>push 2
D>push 1
D>mov eax, [Exemp]
D>push eax
D>call Class.Method
D>

Бред какой-то. А как ты собрался использовать обычную процедуру в качестве метода класса? Откуда она возьмет this? либо передавай его явно, декларировав ее в DLL как
Method(TMyClass* self, int a, int b)

либо ей не нужен this, тогда это статический метод и декларировать его надо в Delphi соответственно:
class procedure Method(a, b: integer);
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Использование классов из dll в Delphi
От: depressman  
Дата: 13.05.05 19:23
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Бред какой-то. А как ты собрался использовать обычную процедуру в качестве метода класса? Откуда она возьмет this? либо передавай его явно, декларировав ее в DLL как


На бред похоже. Согласен. Но так всё работает.
Ещё раз всё по порядку. В dll функция с 2 параметрами. В delphi класс. У класса метод. С двумя параметрами. А передется через стек — 3. Если привязывать импортом из dll к методу эту функцию, то вызов проходит, но парметры они воспринимают по разному. Если бы этот метод был написан в дэлфе, как метод то он бы сам извлекал наверное этот параметр и использовал его как this.
А в самой процедуре мне this и не нужен.
Re[9]: Использование классов из dll в Delphi
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.05.05 03:39
Оценка:
Здравствуйте, depressman, Вы писали:
D>На бред похоже. Согласен. Но так всё работает.
Если бы все работало, ты бы сюда не писал.
D>Ещё раз всё по порядку. В dll функция с 2 параметрами. В delphi класс. У класса метод. С двумя параметрами. А передется через стек — 3. Если привязывать импортом из dll к методу эту функцию, то вызов проходит, но парметры они воспринимают по разному. Если бы этот метод был написан в дэлфе, как метод то он бы сам извлекал наверное этот параметр и использовал его как this.
Конечно.
D>А в самой процедуре мне this и не нужен.
Тогда зачем ты делаешь это в дельфи методом, а не процедурой?
В общем, для тебя самый дешевый способ — добавить в DLL первый параметр void * self и не парить мозг себе и окружающим.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Использование классов из dll в Delphi
От: nik0dim Россия  
Дата: 23.08.05 19:19
Оценка:
Здравствуйте, Daedalus, Вы писали:

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


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


Дела давно минувших дней — статья, как и сайт не доступны. Напишите, пожалуйста, позывные этой статьи, чтоб её ещё где найти.
Re[3]: Использование классов из dll в Delphi
От: anonymous Россия http://denis.ibaev.name/
Дата: 30.10.06 14:56
Оценка:
Здравствуйте, nik0dim, Вы писали:

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

D>>http://rvelthuis.bei.t-online.de/articles/articles-cppobjs.htm
N>Дела давно минувших дней — статья, как и сайт не доступны. Напишите, пожалуйста, позывные этой статьи, чтоб её ещё где найти.

http://rvelthuis.de/articles/articles-cppobjs.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.