Re[9]: Подключение плагина на C++ к программе на Delphi
От: bordo Россия  
Дата: 02.09.09 09:12
Оценка:
Здравствуйте, 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 (да, вот такой я извращенец)

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