Re[3]: Вызов dll функции
От: ononim  
Дата: 06.05.11 19:09
Оценка: +1
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>

F>как то так

Спасибо, поэксперементирую!
Re[5]: Вызов dll функции
От: Figaro Россия  
Дата: 06.05.11 19:32
Оценка:
Наверное все-таки это лучший выход... с ассемблером.. хм.. хреновастенько ИМХО.
Re[3]: Вызов dll функции
От: ononim  
Дата: 06.05.11 20:16
Оценка: 1 (1)
А>Но пока неясно как, вытаскивать аргументы больше 3, т.е. те, которые передаются через стек.
както так:
DWORD __stdcall Sample5Args(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5 )
{
    printf("Sample5Args %x %x %x %x %x \n", a1, a2, a3, a4, a5);
    return a1+a2-a3+a4-a5;
}

__declspec(naked) DWORD DelphiGate_Sample5Args() //give delphi pointer to this func
{ 
    __asm 
    { 
    push edx
    push eax
    mov eax, DWORD PTR [esp+8]
    mov DWORD PTR [esp+8], ecx
    push eax 
    jmp Sample5Args 
    } 
}

тока аргументы будут слегка перепутаны.. наверно
Как много веселых ребят, и все делают велосипед...
Re[4]: Вызов dll функции
От: swingus  
Дата: 07.05.11 02:57
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Потому что ересь. Во-первых, Microsoft-specific;


Неубедительно. Во первых это не только Microsoft specific, но и Borland specific (то есть достаточно распространённое расширение), во-вторых сама задача не лежит в области стандарта C++, а является специфичной для конкретной операционной системы и конкретного компилятора, поэтому излишний языковой пуризм здесь не уместен. Собственно и def файлов в стандарте нет.

C>во-вторых, с помощью этого легко экспортировать что-нибудь такое, что из DLL экспортироваться Не Должно — класс там какой-нибудь, или декорированное C++’ное имя.


Почему класс или имя не должно экспортироваться из dll мне не понятно, тем более dllexport и сделано именно для того, чтобы что-то экспортировать из dll, класс или имя. В данном конкретном случае я не вижу, как можно случайно экспортировать какие-то классы или имена, если вы, конечно, в состоянии контролировать движения своих рук.
Re[5]: Вызов dll функции
От: Centaur Россия  
Дата: 07.05.11 03:26
Оценка:
Здравствуйте, swingus, Вы писали:

S>Почему класс или имя не должно экспортироваться из dll мне не понятно


Потому что предназначение DLL — позволять сопрягать код, написанный на разных языках и скомпилированный разными компиляторами, у которых могут быть разные представления о том, что такое классы вообще и как декорируются имена. Соответственно, в интерфейсе DLL должны быть только типы и имена, универсально понимаемые всеми компиляторами всех языков. То есть — типы, используемые в Win32 API, и недекорированные имена.
Re[6]: Вызов dll функции
От: swingus  
Дата: 07.05.11 19:14
Оценка:
Давайте пойдём от противного. Я, например, не считаю людей, пишущих компиляторы, глупее себя. И если они ввели возможность экпортировать имена, замангленные специфично для конкретного компилятора и пользовательские типы, то я не думаю, что это никчёмная возможность. Из своего опыта я не припомню, что экспортировал скажем, классы, но вполне могу представить себе такую ситуацию, скажем, это удобно для реализации плагинов. Вот, собственно, исходный пост описывает подобную ситуацию.

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

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


S>>Почему класс или имя не должно экспортироваться из dll мне не понятно


C>Потому что предназначение DLL — позволять сопрягать код, написанный на разных языках и скомпилированный разными компиляторами, у которых могут быть разные представления о том, что такое классы вообще и как декорируются имена. Соответственно, в интерфейсе DLL должны быть только типы и имена, универсально понимаемые всеми компиляторами всех языков. То есть — типы, используемые в Win32 API, и недекорированные имена.
Re[5]: Вызов dll функции
От: Alexéy Sudáchen Чили  
Дата: 13.06.11 20:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Да, мне уже написали. Засада , поскольку возможности поменять тип вызова со стороны клиента (ERP) нет. Придется видать __asm юзать. Я тут уже написал (коряво конечно) что-то вроде хэлпера:

O>>А низзя тупо написать промежуточную длл на делфе которая будет вызывать вижловскую с __stdcall?
А>Да можно, просто не хочется иметь такой зоопарк, это же все потом еще сопровождать нужно будет

Дык, можно же написать скрипт на питоне, который будет для DLL с __stdcall С++ экспортами генерировать DLL-переходник с С-эксортами и __fastcall вызовами. Ну компилировать этот переходник дельфёй, борлондовым freetool С++, или вообще сразу ассемблером. Смотря во что генерировать переходник.

Ничего саппортить и не придётся.

Имхо проще всего через freetool. Его можно просто в папочку проекта скопировать =)
Re[7]: Вызов dll функции
От: blackhearted Украина  
Дата: 13.06.11 20:55
Оценка:
Здравствуйте, Аноним, Вы писали:

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


C>>Найдите архитектора системы и оторвите ему архитектилку. Он социально опасен.


А>Архитектора ERP? Да где же его найти то, этой ERP лет 20 как уже, и она практически не развивается


dclspec naked
и руками, руками...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.