请问:如何从函数名称得到函数的指针? ( 积分: 50 )

  • 主题发起人 主题发起人 lll111
  • 开始时间 开始时间
L

lll111

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:<br>有没有办法从函数名称得到函数的指针? 类似于GetProcAddress(HDll,FuncName).<br>Tform的Public函数,不是published。所以不能用methodaddress().
 
请问:<br>有没有办法从函数名称得到函数的指针? 类似于GetProcAddress(HDll,FuncName).<br>Tform的Public函数,不是published。所以不能用methodaddress().
 
好像是申明个指针变量再赋值一下吧..
 
GetProcAddress用于从DLL中获得方法指针,在一般单元中,用MethodAddress获得<br>published类型的方法指针,但对其他(如public、private)类的方法却无非获得地址信息。<br>我是这么解决:<br>定义过程类型,然后通过此类型的变量(就是指向过程或函数的指针)获得方法指针。<br> &nbsp;type PMethods = procedure of Object;<br>type<br> &nbsp;TForm1 = class(TForm)<br> &nbsp; &nbsp;Button1: TButton;<br> &nbsp; &nbsp;Memo1: TMemo;<br> &nbsp; &nbsp;procedure FormClick(Sender: TObject);<br> &nbsp; &nbsp;procedure Button1Click(Sender: TObject);<br> &nbsp;public<br> &nbsp; &nbsp;procedure MethodForTest;<br> &nbsp;published<br> &nbsp; &nbsp;procedure SayHello;<br> &nbsp;end;<br><br>procedure TForm1.FormClick(Sender: TObject);<br>begin<br> &nbsp;showmessage('FormClick!');<br>end;<br><br>procedure TForm1.MethodForTest;<br>begin<br> &nbsp;showmessage('Procedure For Test');<br>end;<br><br>procedure TForm1.SayHello;<br>begin<br> &nbsp;showmessage('Hello!');<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;P_Method :PMethods; &nbsp; &nbsp;//方法类型变量<br> &nbsp;sData :string;<br> &nbsp;aPtr :Pointer; &nbsp; &nbsp; &nbsp; &nbsp; //普通指针变量<br>begin<br> &nbsp;aPtr :=Pointer(@self.Onclick); &nbsp; &nbsp; &nbsp;//直接转换<br> &nbsp;sData :=MethodName(aPtr); &nbsp; &nbsp; &nbsp;//对于此published方法可以用MethodName获得信息<br> &nbsp;sData :=Format('%x : %s',[integer(aPtr),sData]);<br> &nbsp;Memo1.Lines.Add(sData);<br><br> &nbsp;P_Method :=self.SayHello; &nbsp; &nbsp; //published型,方法类型变量赋值 <br> &nbsp;aPtr :=@P_Method;<br> &nbsp;sData :=MethodName(aPtr);<br> &nbsp;sData :=Format('%x : %s',[integer(aPtr),sData]);<br> &nbsp;Memo1.Lines.Add(sData);<br><br> &nbsp;P_Method :=self.MethodForTest; &nbsp; //public型赋值给方法类型变量<br> &nbsp;aPtr :=@P_Method;<br> &nbsp;sData :=MethodName(aPtr); &nbsp; &nbsp; &nbsp; //不能获取<br> &nbsp;sData :=Format('%x : %s',[integer(aPtr),sData]);<br> &nbsp;Memo1.Lines.Add(sData); &nbsp; &nbsp; &nbsp; &nbsp; //只显示地址而没有显示MethodName &nbsp; &nbsp; &nbsp;<br>end;<br><br>显示结果:<br>Memo1<br>455A58 : FormClick<br>455A9C : SayHello<br>455A74 :
 
我在做一个plugin程序,需要调用主程序的function或procedure。<br>Jonson_sunshine的方法不适用于plugin。应该没有任何办法,根据函数名称得到函数的指针。对plugin,就算用interface,也无法做的比较灵活。如果你想使用什么函数,你也必须在主程序的interface中写好。这不算好的plugin系统。如果我把所有的函数和过程全部published.这样不用interface,也可以调用任何函数。<br>大家还有好的想法没有?
 
plugin没做过,而且你的具体结构是怎样呢?<br>用接口如何不够灵活?<br>可不可以试试DLL封装?
 
To Jonson_sunshine:<br>我现在用Jedi的plugin component.免费的,你应该有吧。<br>我的主程序已经做好,用户可以使用。如何在不改变主程序的情况下,实现新增加的功能或替换原来旧的函数?这就是Plugin的作用。例如数据备份和恢复。<br>我的plugin在主程序的菜单中自动添加备份和恢复的菜单项,屏蔽原有的函数,调用plugin中的函数。这是客户化的办法。另外你无法预测,客户提出什么,以后增加什么功能,不好在主程序中预留。所以说Interface和DLL封装不适用。
 
结分了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
913
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部