Почему оно так-хрен его знает. Параметры передаются корректно и возврат происходит тоже корректно.
Вот код:
- Код: Выделить всё
#COMPILE EXE "PC.exe"
#INCLUDE "Win32API.inc"
FUNCTION PBMAIN
DIM adr AS LONG, st(0) AS LONG
adr=GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxA")
st(0)=200
adr=CODEPTR(SFunc)
CALL PCall (Adr, VARPTR (st(0)),4)
MSGBOX "Выполнено"
END FUNCTION
FUNCTION PCall(BYVAL Adr AS LONG,BYVAL pStack AS LONG, BYVAL SS AS LONG)EXPORT AS LONG
DIM cma AS LONG, ret AS LONG
cma=GetProcAddress(GetModuleHandle("kernel32.dll"),"RtlMoveMemory")
DIM n AS LONG
!mov eax,SS
!sub esp,eax
!mov n, esp
!push eax
!push pStack
!push n
!call cma
!call Adr
END FUNCTION
FUNCTION SFunc(BYVAL Arg1 AS DWORD) AS LONG
MSGBOX HEX$(arg1)'+ " "+HEX$(arg2)
END FUNCTION
Другой вариант PCall(тот же результат):
- Код: Выделить всё
FUNCTION PCall1(BYVAL Adr AS DWORD,BYVAL Stack AS DWORD,BYVAL StackSize AS DWORD) AS LONG
!xor eax, eax
!mov edi, Stack
!mov ecx, StackSize
!add ecx, edi
!dec ecx
stloop:
!cmp ecx, edi
!je eloop
!mov al, [ecx]
!mov [esp], al
!dec ecx
!dec esp
!jmp stloop
eloop:
!call Adr
END FUNCTION
Аналогичная тема: http://www.fire-lines.com/forum/viewtopic.php?p=542#542