描述:
我想在一个ATL的简单对象中,在它的一个方法中启动一个定时器,然后在OnTimer事件中做一些事。也可以说,我想在每三秒时间就做一个固定的事。
解决方案1:
不要相应OnTimer了,ATL制作的COM中没有OnTimer。
直接用CallBack函数
让Windows直接将计时器讯息发送给您程式的另一个函式。
接收这些计时器讯息的函式被称为「callback」函式,这是一个在您的程式之中但是由Windows呼叫的函式。您先告诉Windows此函式的位址,然後Windows呼叫此函式。这看起来也很熟悉,因为程式的视窗讯息处理程式实际上也是一种callback函式。当注册视窗类别时,要将函式的位址告诉Windows,当发送讯息给程式时,Windows会呼叫此函式。
SetTimer并非是唯一使用callback函式的Windows函式。CreateDialog和DialogBox函式(将在第十一章中介绍)使用callback函式处理对话方块中的讯息;有几个Windows函式(EnumChildWindow、EnumFonts、EnumObjects、EnumProps和EnumWindow)把列举资讯传递给callback函式;还有几个不那么常用的函式(GrayString、LineDDA和SetWindowHookEx)也要求callback函式。
像视窗讯息处理程式一样,callback函式也必须定义为CALLBACK,因为它是由Windows从程式的程式码段呼叫的。callback函式的参数和callback函式的传回值取决於callback函式的目的。跟计时器有关的callback函式中,输入参数与视窗讯息处理程式的输入参数一样。计时器callback函式不向Windows传回值。
我们把以下的callback函式称为TimerProc(您能够选择与其他一些用语不会发生冲突的任何名称),它只处理WM_TIMER讯息:
VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
处理WM_TIMER讯息
}
TimerProc的参数hwnd是在呼叫SetTimer时指定的视窗代号。Windows只把WM_TIMER讯息送给TimerProc,因此讯息参数总是等於WM_TIMER。iTimerID值是计时器ID,dwTimer值是与从GetTickCount函式的传回值相容的值。这是自Windows启动後所经过的毫秒数。
您使用callback函式处理WM_TIMER讯息时,SetTimer的第四个参数由callback函式的位址取代,如下所示:
SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
您可能想查找下面的文章:
- 请问各位帮忙,有没有这样一个控件??
- 请问有没有人知道AT+CKPD=“s”等AT命令为什么返回ERROR?
- 请问有没有人知道怎么用OBEXPUSH发送文件?
- 请问:有没有关于office内部COM插件的有关资料
- 请问有没有函数或代码可以从进程或线程id得知他们所属的dll或exe的实例句柄注意是id
- 请问有没有根据函数地址来获得该函数的函数名的函数?
- 请问有没有比HookApi更好的方法截获Windows98中用于TCP/IP通讯的connect函数
- 请问有没有检测程序是否缺少dll的工具?我的程序在98下不好用,2000,xp下正常
- 请问在VC中有没有比较好的调试ActiveX插件的方法呢?
- 请问有没有哪位达人知道可以使用自带的控件CMSCOMM单独开辟一个线程(在线等答复)