function StdWndProc(Window: HWND; Message, WParam: Longint;
LParam: Longint): Longint; stdcall; assembler;
asm
XOR EAX,EAX
PUSH EAX
PUSH LParam
PUSH WParam
PUSH Message
MOV EDX,ESP
MOV EAX,[ECX].Longint[4]
CALL [ECX].Pointer //执行类成员
ADD ESP,12 ?????不理解
POP EAX
end;我模仿该机制做了一个,实现了,但是函数执行完毕后总出现错误,帮我看看:
这是DLL中的:
class //某类
……
P:Pointer //类成员
procedure Test(g,l:longint); cdecl;
function GetP: Pointer; //返回P
……
end;
//Create中实现
P:= MyMakeObjectInstance(@TTest.Test);
//MyMakeObjectInstance只是修改了MakeObjectInstance中的一句:
Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdInt));
//使用StdInt取代StdWndProc,实现如下:
procedure Test(g,l:longint); cdecl; assembler;
asm
PUSH l
PUSH g
PUSH EAX //Self
CALL [ECX].Pointer
end;
//***********//
function test: Pointer;
var g:TTest;
begin
g := TTest.Create;
Result := g.getp;
end;exports test;然后在exe中调用Dll中Test返回的函数指针所指函数,预期的调用了TTest类中的Test成员过程,且在Test中使用类其他成员正常。最后还是返回读取内存地址错误。单步调试发现是在
类成员Test过程执行到函数end;后出错,即函数执行完毕后。
我对汇编不懂,也不懂保存现场什么的概念,希望高手指点。
LParam: Longint): Longint; stdcall; assembler;
asm
XOR EAX,EAX
PUSH EAX
PUSH LParam
PUSH WParam
PUSH Message
MOV EDX,ESP
MOV EAX,[ECX].Longint[4]
CALL [ECX].Pointer //执行类成员
ADD ESP,12 ?????不理解
POP EAX
end;我模仿该机制做了一个,实现了,但是函数执行完毕后总出现错误,帮我看看:
这是DLL中的:
class //某类
……
P:Pointer //类成员
procedure Test(g,l:longint); cdecl;
function GetP: Pointer; //返回P
……
end;
//Create中实现
P:= MyMakeObjectInstance(@TTest.Test);
//MyMakeObjectInstance只是修改了MakeObjectInstance中的一句:
Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdInt));
//使用StdInt取代StdWndProc,实现如下:
procedure Test(g,l:longint); cdecl; assembler;
asm
PUSH l
PUSH g
PUSH EAX //Self
CALL [ECX].Pointer
end;
//***********//
function test: Pointer;
var g:TTest;
begin
g := TTest.Create;
Result := g.getp;
end;exports test;然后在exe中调用Dll中Test返回的函数指针所指函数,预期的调用了TTest类中的Test成员过程,且在Test中使用类其他成员正常。最后还是返回读取内存地址错误。单步调试发现是在
类成员Test过程执行到函数end;后出错,即函数执行完毕后。
我对汇编不懂,也不懂保存现场什么的概念,希望高手指点。
解决方案 »
- TClientSocket 的问题,当没有服务器端时占用很高的cpu,我想要它在没找到服务器的情况下放弃连接
- 画半透明图
- 如何判断是否按下Ctrl键或Shift键
- 新人求助,在线等!达人请进!
- delphif访问xml(如何读取,修改编写xml)
- 有delphi不通过ODBC或ADO 直接存取access的控件吗?
- 人民币大写的原码,急!!!
- 关于listview滚动条同步的问题,好像还没有解决的先例,进来看看吧!谁能给予解决的,我愿意给1000分!
- 如何提高速度(在几百条记录中插入一条记录再按顺序排列)?
- 《菜鸟问题》新安装INTERBASE的用户名和密码是什么???
- 求助delphi中一个使用sendmessage的问题
- delphi中有没有将字符串倒排的函数
procedure Test(g,l:longint); cdecl; assembler;
asm
PUSH l
PUSH g
PUSH EAX //Self
CALL [ECX].Pointer
ADD ESP,8 //因为上面压栈8字节
end;
实现了在DLL外部调用DLL中类的成员方法或过程。不用回答了,不过CSDN怎么不能关闭问题?????
提示24小时什么的,要密码,我输入正确后仍然没关闭该问题。