Errata

Subclassing and Hooking with Visual Basic

Errata for Subclassing and Hooking with Visual Basic

Submit your own errata for this product.

The errata list is a list of errors and their corrections that were found after the product was released.

The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.

Color Key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update

Version Location Description Submitted by Date submitted
Printed Page 89
1st paragraph

When you say "... we need to start a new thread in the DLL and use this
thread to execute the DLLFunct function code":

1) How do you start another thread in a DLL?
2) How do you know when it done processing in the Main program?
3) Can you give a short example?

Anonymous   
Printed Page 95
Example 4-1

The Class_Initialize event has the line of code "m_lOrigClass = 0" but on
the previous page, 94, this variable is not defined. I believe it should
be "m_lOrigWndProc =0"

Anonymous   
Printed Page 101
1st paragraph

You have the line of code:
Dim CSubClsApp As CSubClass

if you want to use CSubClsApp outside of the .bas, i.e. in your form, it
must be:
Public CSubClsApp As CSubClass

Anonymous   
Printed Page 102
Example 4-5

In the example code, the line in the book is:
NewWndProc = CallWindowProc(CSubClsApp.OrigWndProc, hwnd, uMsg, wParam,
lParam)

but on p.94 you tell us to name the class CSubClass.
So the line should read:
NewWndProc = CallWindowProc(CSubClass.OrigWndProc, hwnd, uMsg, wParam, lParam)

Anonymous   
Printed Page 109
Example 4.8

The first If statement :

If uMsg = WM_SIZING and wParam <> WMSZ_BOTTOM Then

should this not be :-

If uMsg = WM_SIZING and (wParam <> WMSZ_BOTTOM) Then

caue if you change the wParam check to WMSZ_TOP it doesn't work with the given
example.

Anonymous   
Printed Page 140
At the bottom, example 5-1

When I built this simple example, it didn't work !
The program returned immediately from the call to the API function "GetSaveFileName"
with an error lRetVal=0 , without showing anything first.
I use VB6 SP5, Windows98
I spend two days looking for the solution to the problem. At last I found (in MSDN)
that apparently the trhee last items in the type declaration of OpenFilename are not
supported under Windows98 (or Windows95), and should be commented out. When I did
that, everything worked as promised.

Anonymous   
Printed Page 356
bottom and middle of page

There are two:
1. Middle of page: typedef struct tagMOUSEHOOKSTRUCT was already defined in the
#include "WINUSER.H" file in the "MainHook.cpp". Visual c++ 6 pukes on this one. The
removal of the struct definition in the "MainHook.h" fixes that problem

2. Bottom of Page: "HANDLEhInstance" SHOULD BE "HANDLE hInstance" and
"HHOOKhhookHooks" SHOULD BE "HHOOK hhookHooks"

The print history on page 2 = June 2001

Anonymous   
Printed Page 466
Example 20-1

The JournalPlaybackProc shown here does not work. When I ran this program, it would
play back the macro at lightning speed, which tells me that the delay was not
happening. If you look at the code, the delay time is being set as the return value
when uCode = HC_GETNEXT, however, the function does not exit. It falls through to the
call to CallNextHookEx(). Why set it if you don't return?

I did some searching on the Microsoft site and found their example of
JournalPlaybackProc. From there I discovered what I needed to change. Add a static
boolean called fDelay. Change the code for setting the return value to the following:

If fDelay Then
fDelay = False
JournalPlaybackProc = lParam.time
Exit Function
End If

Then under uCode = HC_SKIP, add the following line:

fDelay = True

Now things play back at the speed that I would expect.

Anonymous