函数指针作为参数的问题
我想用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




