2
votes

Currently I am trying to implement a timer class in VBA. For that purpose I use the SetTimer and KillTimer functions of the Windows API...

This is the interface from Msdn:

  UINT_PTR WINAPI SetTimer(
  __in_opt  HWND hWnd,
  __in      UINT_PTR nIDEvent,
  __in      UINT uElapse,
  __in_opt  TIMERPROC lpTimerFunc
);

And this is the way I declared the function wihtin my VBA-Module:

Private Declare Function SetTimer Lib "user32" (ByVal Handle As Long, _
                                                ByVal TimerIDHandle As Any, _
                                                ByVal ElapseTime As Long, _
                                                ByVal AddressOfAndYourHandlerFunctionName As Long) As Long

                                                'TimerIDHandle is of Type Any so I can pass Nothing to the function

I then Call the function this way:

Dim TimerID As Long

TimerID = SetTimer(Application.hWndAccessApp, ByVal 0&, Timer.Timeout, AddressOf TimeOutHandler)

As Vba does not accept a "Null" I have tried implementing "ByVal 0&". Is this the right way to do it? Anyway...I call this function several times from the same Application and the function always returns 1 as an Identifier even though, according to Msdn, the function should return a unique ID for each timer that is created in the Window handle of the current Access Application.

Furthermore when I created only one timer the Callback function gets Called, but the Timer ID is given as 0, whereas the Settimer-Function returned a 1 at the time of initialization. Here is my Callback Function Header:

Private Sub TimeOutHandler(ByVal WindowHandle As Long, _
                           ByVal TimerMessage As Long, _ 
                           ByVal TimerID As Long, _ 
                           ByVal ElapsedTime As Long)

Where am I wrong?

Any help is greatly appreciated of course ;-)

1

1 Answers

3
votes

It worked. If it failed then it would have returned 0. You get a 0 for TimerID in the callback because you passed a 0 for the nIDEvent argument when you created the timer. You'll need to use the value that SetTimer returned to call KillTimer(). Think of it as a timer 'handle'.

You'll never get this code working in 64-bit mode so just declare the 2nd argument as Long.