PowerBasic, вызов по указателю и MessageBox

Раздел посвящен программированию с использованием Power Basic.
keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

PowerBasic, вызов по указателю и MessageBox

Сообщение keks-n » 16.07.2006 (Вс) 17:49

Понадобилось реализовать в PowerBasic вызов функции по указателю с произвольным количеством аргументов... То есть в некую область памяти заносятся параметры функции, указатель на неё передаётся в PCall, внутри PCall эта область копируется в стек и вызывается искомый адрес... Всё бы хорошо но возникли страшные баги с MessageBox... Криво отрисовывается сообщение и нет заголока окна :shock:
Почему оно так-хрен его знает. Параметры передаются корректно и возврат происходит тоже корректно.
Вот код:
Код: Выделить всё
#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
Изображение

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Re: PowerBasic, вызов по указателю и MessageBox

Сообщение volo » 09.11.2006 (Чт) 23:01

keks-n писал(а):... Криво отрисовывается сообщение и нет заголока окна :shock:
Почему оно так-хрен его знает. Параметры передаются корректно и возврат происходит тоже корректно.



Глюконат возникает при некорректном использовании ESP:
PB имеет свое-образную отработку ESP
Проще сделать код через глобальные переменные


FUNCTION PCall1
...
'!mov [esp], al
!dec ecx
'!dec esp
...


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41

    TopList