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...
Пока на собственное сообщение не было ответов, его можно удалить.