Здравствуйте, wallaby, Вы писали:
W>Дело ваше, я предупредил
На то есть две причины: деплой на 1 длл меньше (у меня их и так несколько), плюс нет лицензионной Дельфи, а есть требование чистоты.
Пробовал собрать под Lazarus, но он отказался экспортировать процедуру без stdcal.
B>> объявляем рабочую функцию в Visual C++ как __stdcall;
W> Проще __fastcall, тогда не нужно будет возиться со стеком
VC++ декорирует __fastcall-функции, поэтому пришлось использовать DEF-файл, но это проще, чем возиться со стеком.
B>> в proxy-функции перетасовываем регистры и стек и делаем jmp на рабочую функцию;
W>Просто нужно переслать EAX в ECX, стек не трогаем
Я так написал потому что совсем не разбираюсь в ассемблере.
B>>Осталось запрограммировать это на ассемблере, не зная его
W>На msdn есть примеры naked-функций — http://msdn.microsoft.com/en-us/library/4d12973a(VS.71).aspx
Обязательно почитаю.
W>Поскольку на C не пишу, могу только набросать идею:
W>W>__declspec(naked) int __fastcall proxyfunc()
W>{
W> __asm {
W> mov ecx,eax
W>/* вызываем рабочую функцию из asm-кода */
W> jmp workfunc
W> }
W>}
W>int __fastcall workfunc(hWnd: DWORD)
W>{
W>...
W>}
W>
W>Или так:
W>W>__declspec(naked) int __fastcall proxyfunc()
W>{
W> dword hWnd;
W> __asm /* prolog */
W> {
W> push ebp
W> mov ebp, esp
W> sub esp, __LOCAL_SIZE
W> mov hWnd,eax
W> }
W>{
W>/* вызываем рабочую функцию из C-кода */
W> workfunc(hWnd)
W>}
W> __asm /* epilog */
W> {
W> mov esp, ebp
W> pop ebp
W> ret
W> }
W>}
W>
Восхитительно, оба способа работают! Теперь буду переписывать то же самое под mingw-gcc (да, вот такой я извращенец)
Огромное спасибо!