DLL не может экспортировать классы в каком то нормальном виде. Она экспортирует функции. Это в VC++ добавили какие то свои навороты. Но для импорта таких классов необходим .lib файл, сделанный при сборке DLL. Он там обворачивает функции, оставляя их реализацию внутри. Т.е. без извратов вообще не обойдешся.
Прежде чем что-то советовать хотелось бы узнать, исходники DLL есть или нет? Есть ли возможность ее изменить? Если ДА, то были дельные советы по использованию ИНТЕРФЕЙСОВ! Если DLL неприкасаема, то надо думать и смотреть каким образом VC сводит вызов методов класса к вызову функций DLL. В последнем случае сразу не соображу щас) Но думаю направление не тупиковое)
Здравствуйте, depressman, Вы писали: D>Так разве __cdecl в VC и cdecl в delphi не одно и то же? А про stdcall я имел ввиду, что и там и там поменял, естественно.
Я не понял, почему вызываемая процедура думает, что параметров меньше. Ты что, полагаешь, что в VC++ this каким-то волшебным образом передается? При одинаковых конвенциях все должно быть одинаково. Причем безопаснее не пользоваться fastcall и fastthis, т.к. они могут укладывать аргументы в регистры в разном порядке. stdcall и ccall должны полностью совпадать.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Я не понял, почему вызываемая процедура думает, что параметров меньше. Ты что, полагаешь, что в VC++ this каким-то волшебным образом передается? При одинаковых конвенциях все должно быть одинаково. Причем безопаснее не пользоваться fastcall и fastthis, т.к. они могут укладывать аргументы в регистры в разном порядке. stdcall и ccall должны полностью совпадать.
В длл процедура описана как обычная процедура, а импортируется она к методу:
procedure Class.Method(a: integer; b: integer); cdecl; external'mydll.dll' name 'MethodProcedure';
При вызове метода из дэлфи кроме обычных параметров передется еще и this. Вот и получается лишний параметр. Что-то вроде:
Бред какой-то. А как ты собрался использовать обычную процедуру в качестве метода класса? Откуда она возьмет this? либо передавай его явно, декларировав ее в DLL как
Method(TMyClass* self, int a, int b)
либо ей не нужен this, тогда это статический метод и декларировать его надо в Delphi соответственно:
classprocedure Method(a, b: integer);
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Бред какой-то. А как ты собрался использовать обычную процедуру в качестве метода класса? Откуда она возьмет this? либо передавай его явно, декларировав ее в DLL как
На бред похоже. Согласен. Но так всё работает.
Ещё раз всё по порядку. В dll функция с 2 параметрами. В delphi класс. У класса метод. С двумя параметрами. А передется через стек — 3. Если привязывать импортом из dll к методу эту функцию, то вызов проходит, но парметры они воспринимают по разному. Если бы этот метод был написан в дэлфе, как метод то он бы сам извлекал наверное этот параметр и использовал его как this.
А в самой процедуре мне this и не нужен.
Здравствуйте, depressman, Вы писали: D>На бред похоже. Согласен. Но так всё работает.
Если бы все работало, ты бы сюда не писал. D>Ещё раз всё по порядку. В dll функция с 2 параметрами. В delphi класс. У класса метод. С двумя параметрами. А передется через стек — 3. Если привязывать импортом из dll к методу эту функцию, то вызов проходит, но парметры они воспринимают по разному. Если бы этот метод был написан в дэлфе, как метод то он бы сам извлекал наверное этот параметр и использовал его как this.
Конечно. D>А в самой процедуре мне this и не нужен.
Тогда зачем ты делаешь это в дельфи методом, а не процедурой?
В общем, для тебя самый дешевый способ — добавить в DLL первый параметр void * self и не парить мозг себе и окружающим.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, nik0dim, Вы писали:
D>>глянь великолепную статью с примером D>>http://rvelthuis.bei.t-online.de/articles/articles-cppobjs.htm N>Дела давно минувших дней — статья, как и сайт не доступны. Напишите, пожалуйста, позывные этой статьи, чтоб её ещё где найти.