一个SetTimer函数回调函数的问题

eastnofail 2005-07-15 01:49:42
VOID CALLBACK TimeProc1(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
DWORD dwTime)
{
::AfxMessageBox("SDGsdfg");
}

VOID CALLBACK CTestTimer::TimeProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
DWORD dwTime)
{
char buf[32]; sprintf(buf, "%d", m_timer);
::AfxMessageBox(buf);
}

int CTestTimer::Execute()
{
m_timer = SetTimer(NULL, 0, 3000, TimeProc);//这句编译出错
m_timer = SetTimer(NULL, 0, 3000, TimeProc1);//这句可以通过

return 0;
}

在编译出错的那句 使用强制转换也通不过,错误提示是:
不能将'void (struct HWND__ *,unsigned int,unsigned int,unsigned long)' 转换为:
'void (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,unsigned long)'
可是TimeProc这个成员方法明明就是__stdcall的调用方式啊!

这种方式在C++Builder下面编译可以通过,请高手给一个解决方案,谢谢
...全文
512 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
逍遥的心 2005-07-15
  • 打赏
  • 举报
回复
AfxMessageBox("SDGsdfg");
这里的"SDGsdfg"是没有固定地址的..

AfxMessageBox(buf);
这里的buf是有固定地址的

这就是问题的根源
eastnofail 2005-07-15
  • 打赏
  • 举报
回复
可是我的类没有窗口句柄
kugou123 2005-07-15
  • 打赏
  • 举报
回复
或者你直接处理WM_TIMER消息吧
kugou123 2005-07-15
  • 打赏
  • 举报
回复
或者你直接处理WM_TIMER消息吧
qrlvls 2005-07-15
  • 打赏
  • 举报
回复
你要确定是 __stdcall 才行
qrlvls 2005-07-15
  • 打赏
  • 举报
回复
static void CALLBACK _TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
}

void __stdcall _TimerProc2(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
}

void SetMyTimer()
{
SetTimer(NULL, 1001, 10, _TimerProc);
SetTimer(NULL, 1001, 10, _TimerProc2);
}

纠正上面的答复“这实际上是VC编译器作的限制”,应该说是VC编译器对VC调用约定的处理方式的问题
caucyniu 2005-07-15
  • 打赏
  • 举报
回复
有时候不是静态也可以啊 我今天就没错,怪啦 ,呵呵 ,与调用方式或者传递参数有关把。
eastnofail 2005-07-15
  • 打赏
  • 举报
回复
既然C++Builder能做到,那我想,办法肯定是有的
eastnofail 2005-07-15
  • 打赏
  • 举报
回复
那高手们有没有什么好的解决方案呢?

就是让SetTimer的回调函数执行类的非静态成员函数,只要达到类似的效果就行,有没有好的想法?

要是不行的话,那就不得不使用一些全局变量以及函数,这样就大大破坏了类的封装结构,达不到可重用的目的
qrlvls 2005-07-15
  • 打赏
  • 举报
回复
这实际上是VC编译器作的限制
qrlvls 2005-07-15
  • 打赏
  • 举报
回复
静态函数才可以,实际上非静态函数本也应该是可以的,只不过安全起见用static,不知道微软在想什么
casinosun 2005-07-15
  • 打赏
  • 举报
回复
VOID CALLBACK CTestTimer::TimeProc(UINT uMsg, UINT_PTR idEvent,
DWORD dwTime)
handsomerun 2005-07-15
  • 打赏
  • 举报
回复
嗯,嗯,一般这种函数如果要是类成员的话,要静态的,

呵呵,比如线程函数
goodboyws 2005-07-15
  • 打赏
  • 举报
回复
必须是静态函数,看来C++ Builder还真是bt
flyelf 2005-07-15
  • 打赏
  • 举报
回复
static void CALLBACK TimeProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
------ DWORD dwTime);

16,471

社区成员

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

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

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