请解释一下,此段代码问题在那儿?(100分)

  • 主题发起人 主题发起人 52253831
  • 开始时间 开始时间
5

52253831

Unregistered / Unconfirmed
GUEST, unregistred user!
一个DLL里的代码,传入主程序中的TPANEL后在上面建个IMAGE后响应鼠标事件。
要问的,事件能响应了,但xMouseMove结束后就提示出错,内存只读。

procedure xMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer) ;
begin
showmessage('dddddddddddddd'); //能运行到这里
end; //这里后就出错了,提示内存只读。

Procedure _xxxxxxxx (mPanel:Pointer);stdcall;export;
Var
Image1 : TImage;
xPanel : TPanel;
Method :TMethod;
begin
xPanel :=mPanel;
Image1 :=TImage.Create(xPanel) ;
Image1.Parent :=xPanel;

Method.Code :=@xMouseMove;
Method.Data :=Image1;
image1.OnMouseMove :=TMouseMoveEvent(Method);
end;
出错后CPU窗口显示这个模块内出错
kernel32.RaiseException:
7C812A09 8BFF mov edi,edi
 
根据个人经验,给出几个检查点:
1.主程序和DLL是否采取了共享内存管理器来避免来自String的问题?
2.请检查主程序中的DLL函数声明是否与DLL内部完全一致——注意stdcall调用约定。
 
将函数参数,多加一个参数:
procedure xMouseMove(Instance, Sender: TObject; Shift: TShiftState; X, Y: Integer) ;
begin
showmessage('dddddddddddddd');
end;

类的函数指针,如果不是在类里面,则需要多加一个第一个参数: Instance: TObject
 
dll 和 exe 都改成带包编译就 ok 啦
 
Instance 怎么我不知道有这参数啊。苍天搞得我头都大了。谢谢ERRORCODE
 
你为什么不用标准的方法来实现呢?
type
TMyClass=class
procedure xMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer) ;
end;

var
MyObj:TMyClass;

Procedure _xxxxxxxx (mPanel:Pointer);stdcall;export;
Var
Image1 : TImage;
xPanel : TPanel;
begin
xPanel :=mPanel;
Image1 :=TImage.Create(xPanel) ;
Image1.Parent :=xPanel;

MyObj:=TMyClass.Create; //Dll 退出时别忘了释放
image1.OnMouseMove :=TMouseMoveEvent(MyObj.xMouseMove);
end;
 
晕,你都知道使用那么变态的方法传送事件,居然不知道那个instance一般都是由编译器给你自动加的,只是因为你的调用方式,在编译dll的时候delphi“忘记了”给你加上,所以需要你自己加。
 
appfirst 不错 真的不知道有这回事
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
937
SUNSTONE的Delphi笔记
S
I
回复
0
查看
819
import
I
后退
顶部