CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

函数指针作为参数的问题

楼主xjluo()2001-05-30 23:17:00 在 C++ Builder / 基础类 提问

我想用TMyForm中的一个成员函数作为参数传递到该窗体之外的另一个函数中,  
  曾记得需要将函数地址作一个转换,但忘了具体如何操作,请大侠不吝赐教。 问题点数:15、回复次数:8Top

1 楼ploto(亲亲土狗)回复于 2001-05-30 23:41:00 得分 3

因为类中的函数并不是一个实际的地址,需是一个相对的地址,要作转换可以参考VCL中的源码。参考TForm中如何是使用WndProc的吧,具体情况我也忘了。Top

2 楼MroM(未死的马)回复于 2001-05-30 23:45:00 得分 12

来了:  
   
  这样声明你的全局函数  
  void   __fastcall   func_global   (void   __fastcall   (__closure   *func_form)   (int)   );  
   
  这是你的Form内的函数  
  void   __fastcall   TMyForm::xxxxx   (int   i);  
   
  就是这样的形式Top

3 楼xjluo()回复于 2001-05-30 23:56:00 得分 0

这样应该可以解决全部在BCB中操作时的问题,但是我的func_global是用VC写的,  
  而VC中没有__closure关键字。我记得有一个函数可以转换函数指针。Top

4 楼MroM(未死的马)回复于 2001-05-31 00:06:00 得分 0

是不是DLL啊  
  那就GetProcAddressTop

5 楼xjluo()回复于 2001-05-31 00:31:00 得分 0

非也。func_global在DLL中,TMyForm在主程序中。  
  也就是VC做的DLL,BCB做EXE。Top

6 楼MroM(未死的马)回复于 2001-05-31 00:53:00 得分 0

这个...不知道了,或许这样试试,把func_global的改成这样  
  void   __fastcall   func_global   (void   __fastcall   (*func_form)   (DWORD,   int)   );  
   
  其中的DWORD就当做this指针的占位符,不知道这样行不  
  Top

7 楼MroM(未死的马)回复于 2001-05-31 01:10:00 得分 0

啊,我想我明白你的意思了,   就是一个数据类型转换  
  大概这样的形式:  
  void   func_global(LPVOID   addr)  
  {  
      void   (*func)   (int   i);  
      func   =   (void   (*)   (int)   )addr;  
       
  }Top

8 楼xjluo()回复于 2001-05-31 01:30:00 得分 0

问题已经解决了。但不是MroM最后一篇中所说的那样。为什么不能直接使用的原因如下:  
   
  In   C++,   you   cannot   cast   a   member   function   pointer   to   a   normal   function   pointer.  
  For   example:  
   
  class   A   {  
  public:  
        int   myex();  
  };  
  typedef   int   (*fp)();  
  test()  
  {  
        fp   myfp   =   (fp)   &A::myex;   //error  
        return   myfp();  
  }  
   
  The   reason   being   that   a   class   member   function   takes   a   hidden   parameter,   the   this   pointer,   thus   it   behaves   very   differently   than   a   normal   function   pointer.  
   
  A   static   member   function   behaves   as   normal   function   pointer   and   can   be   cast.  
  For   example:  
   
  class   A   {  
  public:  
        static   int   myex();  
  };  
  typedef   int   (*fp)();  
  test()  
  {  
        fp   myfp   =   (fp)   &A::myex;   //ok  
        return   myfp();  
  }  
   
  However,   static   member   functions   can   only   access   static   data   members   of   the   class.  
   
  最后我解决的方法是再声明一个全局函数,直接调用TMyForm中的相应函数,代价是  
  TMyForm窗体必须是全局可访问的。上面英文的内容参见BCB中错误E2031的说明。  
   
  尽管结果如此,还是非常感谢MroM有益的讨论。  
  Top

相关问题

  • 求助:含有函数指针参数的函数模板
  • 函数模板问题(带一个函数指针参数)
  • (指针)一个指针作为函数参数的问题
  • 问一下关于指向函数的指针作函数参数的问题!!!!
  • 关于类成员函数中函数指针参数的问题!!
  • 非静态成员函数指针能做其他函数的参数吗
  • 一个指针作为参数调用函数的问题
  • 如何传递成员函数指针参数
  • 将函数指针作为参数,应该怎么办?
  • c中的函数参数问题?????(有指针)

关键词

  • 函数
  • 指针
  • 转换
  • dll
  • 解决
  • tmyform
  • myfp
  • myex
  • func
  • fastcall

得分解答快速导航

  • 帖主:xjluo
  • ploto
  • MroM

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo