C++Builder中使用回调的问题(300分)

  • 主题发起人 主题发起人 kelisten
  • 开始时间 开始时间
K

kelisten

Unregistered / Unconfirmed
GUEST, unregistred user!
在使用的DLL和头文件中有如下的声明:
typedef int HandleFunc(int a, int b);//头文件声明
int sethandle(char *handleName, void *tag, HandlerFunc*);//dll提供的函数
我想在一个class TA中设置成回调方式,让另外的一个class TB处理回调的内容,如下:
typedef void __fastcall (__closour *TOnLogText)(AnsiString Log)
class TA{
private:
HandleFunc FHanFunc;
TOnLogText FOnLog;
public:
void InvokeHandle();
__property HandleFunc OnHanFunc = {read =FHanFunc, write = FHanFunc }
__property TOnLogText OnLog = {read = FOnLog, write = FOnLog}
}
void TA::InvokeHandle()
{
sethandle("Set Test", NULL, &FHanFunc);
//上面的如果改为函数方式
//3:sethandle("Set Test", NULL, invokeFunc);
//int invokeFunc(int a, int b)
}
class TB{
private:
TA *A;
int func(int a, int b);
void __fastcall OnLog(AnsiString Log);
public:
void initA();

}
void TB::initA()
{
A = new TA;
A->OnLog = OnLog;
//1:回调声明成功
A->OnHanFunc = func;
//2:这项声明的时候提示错误
}
上面的问题我在class TB中处理TA的属性OnHanFunc的时候,声明不成功,如果改为回调函数不在class TA中进行处理的时候,即改为在class TA外进行处理,如上面的3处,函数int invokeFunc(int a, int b)在TA之外进行处理的时候,成功。
试问:1:需要在上面的声明中,TB中如何处理TA的回调属性?
2:如何处理TA中的sethandle(char *handleName, void *tag, HandlerFunc*)函数,使其HandlerFunc的指针指向TB中的函数,让TB中的函数处理HandlerFunc回调的内容?

 
C++Builder中的类中的函数指针处理回调要加__closure关键字才能编译通过的
 
to redcony:
这个我不清楚是否一定要加,上面我的说明中也有回调的例子。但是就是不清楚如何实现上面的。
急切盼望高手指点,指点!!!
 
typedef int __stdcall (__closure *HandleFunc)(int, int);//回调函数指针类型
就行了,记得DLL要重新编的哦
 
to redcony:
由于提供dll方是硬件商,无法更改他的声明的。不过还是谢谢你。
难道没有解决办法了吗?
 
C++中只要是类的非静态成员函数,编译器都会在函数
的参数链表中加入this指针,所以你的int TB::fun(int ,int)会变成int fun(TB *,int, int)和Dll声明的函数指针类型不匹配当然通不过了,除非你的函数是静态的成员函数
static int TB::fun(int, int)
 
后退
顶部