O>>Вобщем, по дефолту, если не указывать тип вызова, делфи свой очесь специфичный __fastcall, аналогов которому в вижле нету. Потому — определите в делфе функцию как stdcall и в вижле — как __stdcall. Если конечно имеется возможность. А>Да, мне уже написали. Засада , поскольку возможности поменять тип вызова со стороны клиента (ERP) нет. Придется видать __asm юзать. Я тут уже написал (коряво конечно) что-то вроде хэлпера:
А низзя тупо написать промежуточную длл на делфе которая будет вызывать вижловскую с __stdcall?
Как много веселых ребят, и все делают велосипед...
Re[4]: Вызов dll функции
От:
Аноним
Дата:
06.05.11 19:17
Оценка:
Здравствуйте, ononim, Вы писали:
O>>>Вобщем, по дефолту, если не указывать тип вызова, делфи свой очесь специфичный __fastcall, аналогов которому в вижле нету. Потому — определите в делфе функцию как stdcall и в вижле — как __stdcall. Если конечно имеется возможность. А>>Да, мне уже написали. Засада , поскольку возможности поменять тип вызова со стороны клиента (ERP) нет. Придется видать __asm юзать. Я тут уже написал (коряво конечно) что-то вроде хэлпера: O>А низзя тупо написать промежуточную длл на делфе которая будет вызывать вижловскую с __stdcall?
Да можно, просто не хочется иметь такой зоопарк, это же все потом еще сопровождать нужно будет
Re[4]: Вызов dll функции
От:
Аноним
Дата:
06.05.11 19:23
Оценка:
Здравствуйте, Figaro, Вы писали:
F>skipped
F>через стэк: F>
F>asm {
F> mov edx, [esp+n*4]; n - номер параметра, начиная с единицы
F> mov [param], edx
F>}
F>
Здравствуйте, Centaur, Вы писали:
C>Потому что ересь. Во-первых, Microsoft-specific;
Неубедительно. Во первых это не только Microsoft specific, но и Borland specific (то есть достаточно распространённое расширение), во-вторых сама задача не лежит в области стандарта C++, а является специфичной для конкретной операционной системы и конкретного компилятора, поэтому излишний языковой пуризм здесь не уместен. Собственно и def файлов в стандарте нет.
C>во-вторых, с помощью этого легко экспортировать что-нибудь такое, что из DLL экспортироваться Не Должно — класс там какой-нибудь, или декорированное C++’ное имя.
Почему класс или имя не должно экспортироваться из dll мне не понятно, тем более dllexport и сделано именно для того, чтобы что-то экспортировать из dll, класс или имя. В данном конкретном случае я не вижу, как можно случайно экспортировать какие-то классы или имена, если вы, конечно, в состоянии контролировать движения своих рук.
Здравствуйте, swingus, Вы писали:
S>Почему класс или имя не должно экспортироваться из dll мне не понятно
Потому что предназначение DLL — позволять сопрягать код, написанный на разных языках и скомпилированный разными компиляторами, у которых могут быть разные представления о том, что такое классы вообще и как декорируются имена. Соответственно, в интерфейсе DLL должны быть только типы и имена, универсально понимаемые всеми компиляторами всех языков. То есть — типы, используемые в Win32 API, и недекорированные имена.
Давайте пойдём от противного. Я, например, не считаю людей, пишущих компиляторы, глупее себя. И если они ввели возможность экпортировать имена, замангленные специфично для конкретного компилятора и пользовательские типы, то я не думаю, что это никчёмная возможность. Из своего опыта я не припомню, что экспортировал скажем, классы, но вполне могу представить себе такую ситуацию, скажем, это удобно для реализации плагинов. Вот, собственно, исходный пост описывает подобную ситуацию.
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, swingus, Вы писали:
S>>Почему класс или имя не должно экспортироваться из dll мне не понятно
C>Потому что предназначение DLL — позволять сопрягать код, написанный на разных языках и скомпилированный разными компиляторами, у которых могут быть разные представления о том, что такое классы вообще и как декорируются имена. Соответственно, в интерфейсе DLL должны быть только типы и имена, универсально понимаемые всеми компиляторами всех языков. То есть — типы, используемые в Win32 API, и недекорированные имена.
Здравствуйте, Аноним, Вы писали:
А>>>Да, мне уже написали. Засада , поскольку возможности поменять тип вызова со стороны клиента (ERP) нет. Придется видать __asm юзать. Я тут уже написал (коряво конечно) что-то вроде хэлпера: O>>А низзя тупо написать промежуточную длл на делфе которая будет вызывать вижловскую с __stdcall? А>Да можно, просто не хочется иметь такой зоопарк, это же все потом еще сопровождать нужно будет
Дык, можно же написать скрипт на питоне, который будет для DLL с __stdcall С++ экспортами генерировать DLL-переходник с С-эксортами и __fastcall вызовами. Ну компилировать этот переходник дельфёй, борлондовым freetool С++, или вообще сразу ассемблером. Смотря во что генерировать переходник.
Ничего саппортить и не придётся.
Имхо проще всего через freetool. Его можно просто в папочку проекта скопировать =)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Centaur, Вы писали:
C>>Найдите архитектора системы и оторвите ему архитектилку. Он социально опасен.
А>Архитектора ERP? Да где же его найти то, этой ERP лет 20 как уже, и она практически не развивается