回调函数相关问题

dkbrain 2009-11-24 05:07:09
我的程序中有一个回调函数,但是回调函数是属于静态函数,所以只能调用静态变量和静态成员函数,但是我想调用其他类中的非静态成员函数以及变量,我该怎么做的?不要告诉我定义一个静态的类实例。
由于要调用的函数和变量比较多,初步想法是在回调函数中发送一条消息,当系统调用回调函数时就通过在回调中发送一条消息,然后在消息响应函数中再去处理相应的操作。但是SendMessage()函数本身也就不是一个静态函数,所以调用SendMessage()函数就会报错,也许有人就会说一开始就不用回调函数方式,直接采用消息通知方式发送消息,其实我也想,但可惜别人提供的DLL中就是采用回调函数,我也没办法,只能在某一事件发生时调用回调函数来进行响应操作。
请给为牛人支支招啊。
...全文
142 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_anthony 2009-11-25
  • 打赏
  • 举报
回复
一般来说,回调函数多数是类似于这种类型:

void TestProc(void* lpParam, DWORD (*lpCallBackFunc)(void*));
DWORD CallBackFunc(void* lpParam);

我们调用TestProc,而TestProc调用lpCallBackFunc,其中lpParam会被传递到CallBackFunc作参数。
比如CreateThread、EnumWindows这类都是如此。
而这种应用重点就在于lpParam怎么使用,如果你只需要传递一个参数,那么可以直接使用lpParam,但是如果现在需要多个参数,那么就应该使用结构体或类对象指针作参数。
LZ上面说过这个回调确实有一个参数,但是你却把浪费了。如果确实如此,那么你最应该做的是重新设计的这个珍稀参数的利用方式。
maple_zhj 2009-11-25
  • 打赏
  • 举报
回复
定义接口时,有问题。

重新设计吧。
一线coder 2009-11-24
  • 打赏
  • 举报
回复
是啊,建议修改DLL的实现啊
dvlinker 2009-11-24
  • 打赏
  • 举报
回复
其实,我之前也遇到同样的问题,然后就让同事把他写的DLL的相关接口函数改了一下,结果我这边好处理的多。你要用到五六个类的实例?实际应用时一般是不会出现你所假设的这种情况的。[Quote=引用 15 楼 chenlycly 的回复:]
看是否能让写DLL的人,重新修改一下,这样的话在调用端好处理的多。只要将调用端的参数再传给调用端就可以了。引用 2 楼 dkbrain 的回复:
回调函数格式是由DLL决定的,自己写的回调函数只能有一个参数,而且这个参数已经作其他用途了。没办法再添加一个参数啊。假如我要用到五六个类的实例怎么办的?全弄成参数形式传入?希望楼上处于牛A和牛C之间的人物给个其他的建议啊。

[/Quote]
dvlinker 2009-11-24
  • 打赏
  • 举报
回复
看是否能让写DLL的人,重新修改一下,这样的话在调用端好处理的多。只要将调用端的参数再传给调用端就可以了。[Quote=引用 2 楼 dkbrain 的回复:]
回调函数格式是由DLL决定的,自己写的回调函数只能有一个参数,而且这个参数已经作其他用途了。没办法再添加一个参数啊。假如我要用到五六个类的实例怎么办的?全弄成参数形式传入?希望楼上处于牛A和牛C之间的人物给个其他的建议啊。
[/Quote]
zzx696969 2009-11-24
  • 打赏
  • 举报
回复
楼上已经说得很详细了
dvlinker 2009-11-24
  • 打赏
  • 举报
回复
下面是消息响应函数:
LRESULT CDlgAlertInfoSet::OnFinishGettingRules(WPARAM wParma, LPARAM lParam)
{
......
return 0;
}
dvlinker 2009-11-24
  • 打赏
  • 举报
回复
CDlgAlertInfoSet类的成员函数CDlgAlertInfoSet::GetIntelAlertRules()定义如下:
void CDlgAlertInfoSet::GetIntelAlertRules(char* ruleName, unsigned char* ruleId, int isEnabled)
{
......
if (m_intelAlertRules.size() == m_nIntelAlertRuleNum)
{
SendMessage(WM_GETRULES_FINISH,0,0);//发消息
}
......
{
dvlinker 2009-11-24
  • 打赏
  • 举报
回复
回调函数GetRuleInfoAddrProc()中将调用所在CDlgAlertInfoSet类的成员函数CDlgAlertInfoSet::GetIntelAlertRules(),然后在CDlgAlertInfoSet::GetIntelAlertRules()中判断当满足某种条件是用SendMessage()来发自定义消息,然后在自定义消息的相应函数中对数据进行相关的处理。回调函数GetRuleInfoAddrProc()的定义如下:
void CDlgAlertInfoSet::GetRuleInfoAddrProc(void* userData, char* ruleName, unsigned char* ruleId, int isEnabled)
{
CDlgAlertInfoSet *dlg = (CDlgAlertInfoSet *)userData;//数据类型的强制转换
dlg->GetIntelAlertRules(ruleName, ruleId, isEnabled);//通过转换得来的指针变量来访问CDlgAlertInfoSet类的成员函数GetIntelAlertRules()
}
zzx696969 2009-11-24
  • 打赏
  • 举报
回复
路过,学习一下~
dvlinker 2009-11-24
  • 打赏
  • 举报
回复
我是要调用同事写的Dll库,通过指定回调函数来获取相关数据信息。首先把需要使用的变量所在的类对象作为参数传入,在回调函数中进行强制转换。我的回调函数的原型为:
class CDlgAlertInfoSet : public CDialog
{
......
public:
static void GetRuleInfoAddrProc(void* userData, char* ruleName, unsigned char* ruleId, int isEnabled);//将回调函数声明为类的静态函数,userData参数对应要传入的要使用的变量所在的类对象
......
}
dvlinker 2009-11-24
  • 打赏
  • 举报
回复
等会我给你贴一段代码,呵呵~巧了,我昨天在作项目的过程中和你遇到同样的问题,我也只是个刚从学校毕业的菜鸟。
dvlinker 2009-11-24
  • 打赏
  • 举报
回复
就是~[Quote=引用 1 楼 happyparrot 的回复:]
回调函数不是有参数嘛,把你需要使用的变量所在的类对象作为参数传入,在回调函数中进行强制转换就行,。
[/Quote]
Abcix 2009-11-24
  • 打赏
  • 举报
回复
鹦鹉不工作吗?怎么到处能看见你?
快乐鹦鹉 2009-11-24
  • 打赏
  • 举报
回复
如果有多个类实例要传递,那你就传包含这些类实例的对象作为参数,实在不行,你就把app指针传递进去。
更多的需要思考的是,你的模块设计是否有问题。估计需要进行重构了。
oyljerry 2009-11-24
  • 打赏
  • 举报
回复
回调函数的第一个参数用你需要方法的对象指针传递进去,然后回调函数中就可以利用这个指针访问这个对象的成员和方法
Allen_zhang 2009-11-24
  • 打赏
  • 举报
回复
用::SendMessage嘛,定义如下

LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);


方式有很多吧??
1、将你的类指针通过回调函数的参数传进去
2、定义一个全局的类指针,适当的时候赋值一下
3、定义一个静态的类实例这个也可以啊,至于你的程序用不用得了看你怎样处理而已
dkbrain 2009-11-24
  • 打赏
  • 举报
回复
回调函数格式是由DLL决定的,自己写的回调函数只能有一个参数,而且这个参数已经作其他用途了。没办法再添加一个参数啊。假如我要用到五六个类的实例怎么办的?全弄成参数形式传入?希望楼上处于牛A和牛C之间的人物给个其他的建议啊。
快乐鹦鹉 2009-11-24
  • 打赏
  • 举报
回复
回调函数不是有参数嘛,把你需要使用的变量所在的类对象作为参数传入,在回调函数中进行强制转换就行,。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧