- added support plug-in DLLs for winhelp
- added preliminary support for plug-in callback into winhelp
- rewrote all the macros accordingly (macro entry-point has to have
  WINAPI calling convention)
- some fixes for embedded images decompression
- misc cleanups

diff --git a/programs/winhelp/Makefile.in b/programs/winhelp/Makefile.in
index 5170eac..9879c23 100644
--- a/programs/winhelp/Makefile.in
+++ b/programs/winhelp/Makefile.in
@@ -8,10 +8,11 @@
 PROGRAMS  = hlp2sgml
 
 C_SRCS = \
-	winhelp.c \
+	callback.c \
 	hlpfile.c \
 	macro.c \
-	string.c
+	string.c \
+	winhelp.c
 
 EXTRA_SRCS = macro.lex.l
 EXTRA_OBJS = @LEX_OUTPUT_ROOT@.o
diff --git a/programs/winhelp/callback.c b/programs/winhelp/callback.c
new file mode 100644
index 0000000..3627547
--- /dev/null
+++ b/programs/winhelp/callback.c
@@ -0,0 +1,178 @@
+/*
+ * Help Viewer - DLL callback into WineHelp
+ *
+ * Copyright 2004 Eric Pouech
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdio.h>
+
+#include "windows.h"
+#include "winhelp.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(winhelp);
+
+static WORD CALLBACK WHD_GetFSError(void)
+{
+    WINE_FIXME("()\n");
+    return 0;
+}
+
+static HANDLE CALLBACK WHD_Open(LPSTR name, BYTE flags)
+{
+    unsigned    mode = 0;
+
+    WINE_FIXME("(%s %x)\n", wine_dbgstr_a(name), flags);
+    switch (flags)
+    {
+    case 0: mode = GENERIC_READ | GENERIC_WRITE; break;
+    case 2: mode = GENERIC_READ; break;
+    default: WINE_FIXME("Undocumented flags %x\n", flags);
+    }
+    return CreateFile(name, mode, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+}
+
+static WORD CALLBACK WHD_Close(HANDLE fs)
+{
+    WINE_FIXME("(%p)\n", fs);
+    CloseHandle(fs);
+    return 0;
+}
+
+static HANDLE CALLBACK WHD_OpenBag(HANDLE fs, LPSTR name, BYTE flags)
+{
+    WINE_FIXME("(%p %s %x)\n", fs, name, flags);
+    return NULL;
+}
+
+static HANDLE CALLBACK WHD_CloseBag(HANDLE bag)
+{
+    WINE_FIXME("()\n");
+    return NULL;
+}
+
+static LONG CALLBACK WHD_ReadBag(HANDLE bag, BYTE* ptr, LONG len)
+{
+    WINE_FIXME("()\n");
+    return 0;
+}
+
+static LONG CALLBACK WHD_TellBag(HANDLE bag)
+{
+    WINE_FIXME("()\n");
+    return 0;
+}
+
+static LONG CALLBACK WHD_SeekBag(HANDLE bag, LONG offset, WORD whence)
+{
+    WINE_FIXME("()\n");
+    return 0;
+}
+
+static BOOL CALLBACK WHD_IsEofBag(HANDLE bag)
+{
+    WINE_FIXME("()\n");
+    return FALSE;
+}
+
+static LONG CALLBACK WHD_SizeBag(HANDLE bag)
+{
+    WINE_FIXME("()\n");
+    return 0;
+}
+
+static BOOL CALLBACK WHD_Access(HANDLE fs, LPSTR name, BYTE flags)
+{
+    WINE_FIXME("()\n");
+    return FALSE;
+}
+
+static WORD CALLBACK WHD_LLInfoFromBag(HANDLE bag, WORD opt, LPWORD p1, LPLONG p2, LPLONG p3)
+{
+    WINE_FIXME("()\n");
+    return 0;
+}
+
+static WORD CALLBACK WHD_LLInfoFromFile(HANDLE fs, LPSTR name, WORD opt, LPWORD p1, LPLONG p2, LPLONG p3)
+{
+    WINE_FIXME("()\n");
+    return 0;
+}
+
+static void CALLBACK WHD_Error(int err)
+{
+    WINE_FIXME("()\n");
+}
+
+static void CALLBACK WHD_ErrorString(LPSTR err)
+{
+    WINE_FIXME("()\n");
+}
+
+static LONG CALLBACK WHD_GetInfo(WORD what, HWND hnd)
+{
+    LONG        ret = 0;
+
+    WINE_TRACE("(%x %p)\n", what, hnd);
+    switch (what)
+    {
+    case 0: break;
+    case 1: /* instance */ ret = (LONG)Globals.hInstance; break;
+    case 3: /* current window */ ret = (LONG)Globals.active_win->hMainWnd; break;
+    case 2: /* main window */
+    case 4: /* handle to opened file */
+    case 5: /* foreground color */
+    case 6: /* background color */
+    case 7: /* topic number */
+    case 8: /* current opened file name */
+        WINE_FIXME("NIY %u\n", what);
+        break;
+    default:
+        WINE_FIXME("Undocumented %u\n", what);
+        break;
+    }
+    return ret;
+}
+
+static LONG CALLBACK WHD_API(LPSTR x, WORD xx, DWORD xxx)
+{
+    WINE_FIXME("()\n");
+    return 0;
+}
+
+FARPROC Callbacks[] =
+{
+    (FARPROC)WHD_GetFSError, 
+    (FARPROC)WHD_Open, 
+    (FARPROC)WHD_Close, 
+    (FARPROC)WHD_OpenBag, 
+    (FARPROC)WHD_CloseBag,
+    (FARPROC)WHD_ReadBag,
+    (FARPROC)WHD_TellBag,
+    (FARPROC)WHD_SeekBag,
+    (FARPROC)WHD_IsEofBag, 
+    (FARPROC)WHD_SizeBag,
+    (FARPROC)WHD_Access,
+    (FARPROC)WHD_LLInfoFromBag, 
+    (FARPROC)WHD_LLInfoFromFile, 
+    (FARPROC)WHD_Error,
+    (FARPROC)WHD_ErrorString,
+    (FARPROC)WHD_GetInfo,
+    (FARPROC)WHD_API
+};
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index 04e0f5d..d56e2c6 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -91,11 +91,12 @@
 static void  HLPFILE_UncompressRLE(const BYTE* src, const BYTE* end, BYTE** dst, unsigned dstsz);
 static BOOL  HLPFILE_ReadFont(HLPFILE* hlpfile);
 
+#if 0
 /***********************************************************************
  *
  *           HLPFILE_PageByNumber
  */
-HLPFILE_PAGE *HLPFILE_PageByNumber(LPCSTR lpszPath, UINT wNum)
+static HLPFILE_PAGE *HLPFILE_PageByNumber(LPCSTR lpszPath, UINT wNum)
 {
     HLPFILE_PAGE *page;
     HLPFILE *hlpfile = HLPFILE_ReadHlpFile(lpszPath);
@@ -110,6 +111,7 @@
 
     return page;
 }
+#endif
 
 /* FIXME:
  * this finds the page containing the offset. The offset can either
@@ -534,7 +536,7 @@
         if (!dst) return NULL;
         HLPFILE_UncompressRLE(src, src + csz, &tmp, sz);
         if (tmp - dst != sz)
-            WINE_FIXME("Bogus gfx sizes (RunLen): %u/%u\n", tmp - dst, sz);
+            WINE_WARN("Bogus gfx sizes (RunLen): %u/%u\n", tmp - dst, sz);
         break;
     case 2: /* LZ77 */
         sz77 = HLPFILE_UncompressedLZ77_Size(src, src + csz);
@@ -671,7 +673,7 @@
     hsoff = GET_UINT(ptr, 4);
     ptr += 8;
 
-    WINE_FIXME("sz=%lu csz=%lu (%ld,%ld) offs=%lu/%u,%lu\n", 
+    WINE_TRACE("sz=%lu csz=%lu (%ld,%ld) offs=%lu/%u,%lu\n", 
                size, csize, mfp.xExt, mfp.yExt, off, ptr - beg, hsoff);
 
     bits = HLPFILE_DecompressGfx(beg + off, csize, size, pack);
@@ -1785,10 +1787,10 @@
     while (src < end)
     {
         ch = *src++;
+        if (!(ch & 0x7F)) continue;
         if (ch & 0x80)
         {
             ch &= 0x7F;
-            if (ch == 0) WINE_FIXME("Null length 1, next is %u\n", *src);
             if ((*dst) + ch < sdst)
                 memcpy(*dst, src, ch);
             src += ch;
@@ -1796,18 +1798,13 @@
         else
         {
             if ((*dst) + ch < sdst)
-                memset(*dst, (char)*src, ch);
-            src++;
-            if (ch == 0)
-            {
-                WINE_FIXME("Null length 2, next is %u\n", *src);
-            }
+                memset(*dst, (char)*src++, ch);
         }
         *dst += ch;
     }
     if (*dst != sdst)
-        WINE_FIXME("Buffer X-flow: d(%u) instead of d(%u)\n",
-                   *dst - (sdst - dstsz), dstsz);
+        WINE_WARN("Buffer X-flow: d(%u) instead of d(%u)\n",
+                  *dst - (sdst - dstsz), dstsz);
 }
 
 /******************************************************************
diff --git a/programs/winhelp/macro.c b/programs/winhelp/macro.c
index d75a430..71efad4 100644
--- a/programs/winhelp/macro.c
+++ b/programs/winhelp/macro.c
@@ -37,7 +37,7 @@
     char*       alias;
     BOOL        isBool;
     char*       arguments;
-    void        (*fn)();
+    FARPROC     fn;
 };
 
 /* types:
@@ -48,97 +48,97 @@
  */
 
 static struct MacroDesc MACRO_Builtins[] = {
-    {"About",               NULL, 0, "",       MACRO_About},
-    {"AddAccelerator",      "AA", 0, "UUS",    MACRO_AddAccelerator},
-    {"ALink",               "AL", 0, "SUS",    MACRO_ALink},
-    {"Annotate",            NULL, 0, "",       MACRO_Annotate},
-    {"AppendItem",          NULL, 0, "SSSS",   MACRO_AppendItem},
-    {"Back",                NULL, 0, "",       MACRO_Back},
-    {"BackFlush",           "BF", 0, "",       MACRO_BackFlush},
-    {"BookmarkDefine",      NULL, 0, "",       MACRO_BookmarkDefine},
-    {"BookmarkMore",        NULL, 0, "",       MACRO_BookmarkMore},
-    {"BrowseButtons",       NULL, 0, "",       MACRO_BrowseButtons},
-    {"ChangeButtonBinding", "CBB",0, "SS",     MACRO_ChangeButtonBinding},
-    {"ChangeEnable",        "CE", 0, "SS",     MACRO_ChangeEnable},
-    {"ChangeItemBinding",   "CIB",0, "SS",     MACRO_ChangeItemBinding},
-    {"CheckItem",           "CI", 0, "S",      MACRO_CheckItem},
-    {"CloseSecondarys",     "CS", 0, "",       MACRO_CloseSecondarys},
-    {"CloseWindow",         "CW", 0, "S",      MACRO_CloseWindow},
-    {"Compare",             NULL, 0, "S",      MACRO_Compare},
-    {"Contents",            NULL, 0, "",       MACRO_Contents},
-    {"ControlPanel",        NULL, 0, "SSU",    MACRO_ControlPanel},
-    {"CopyDialog",          NULL, 0, "",       MACRO_CopyDialog},
-    {"CopyTopic",           "CT", 0, "",       MACRO_CopyTopic},
-    {"CreateButton",        "CB", 0, "SSS",    MACRO_CreateButton},
-    {"DeleteItem",          NULL, 0, "S",      MACRO_DeleteItem},
-    {"DeleteMark",          NULL, 0, "S",      MACRO_DeleteMark},
-    {"DestroyButton",       NULL, 0, "S",      MACRO_DestroyButton},
-    {"DisableButton",       "DB", 0, "S",      MACRO_DisableButton},
-    {"DisableItem",         "DI", 0, "S",      MACRO_DisableItem},
-    {"EnableButton",        "EB", 0, "S",      MACRO_EnableButton},
-    {"EnableItem",          "EI", 0, "S",      MACRO_EnableItem},
-    {"EndMPrint",           NULL, 0, "",       MACRO_EndMPrint},
-    {"ExecFile",            "EF", 0, "SSUS",   MACRO_ExecFile},
-    {"ExecProgram",         "EP", 0, "SU",     MACRO_ExecProgram},
-    {"Exit",                NULL, 0, "",       MACRO_Exit},
-    {"ExtAbleItem",         NULL, 0, "SU",     MACRO_ExtAbleItem},
-    {"ExtInsertItem",       NULL, 0, "SSSSUU", MACRO_ExtInsertItem},
-    {"ExtInsertMenu",       NULL, 0, "SSSUU",  MACRO_ExtInsertMenu},
-    {"FileExist",           "FE", 1, "S",      (void (*)())MACRO_FileExist},
-    {"FileOpen",            "FO", 0, "",       MACRO_FileOpen},
-    {"Find",                NULL, 0, "",       MACRO_Find},
-    {"Finder",              "FD", 0, "",       MACRO_Finder},
-    {"FloatingMenu",        NULL, 0, "",       MACRO_FloatingMenu},
-    {"Flush",               "FH", 0, "",       MACRO_Flush},
-    {"FocusWindow",         NULL, 0, "S",      MACRO_FocusWindow},
-    {"Generate",            NULL, 0, "SUU",    MACRO_Generate},
-    {"GotoMark",            NULL, 0, "S",      MACRO_GotoMark},
-    {"HelpOn",              NULL, 0, "",       MACRO_HelpOn},
-    {"HelpOnTop",           NULL, 0, "",       MACRO_HelpOnTop},
-    {"History",             NULL, 0, "",       MACRO_History},
-    {"InitMPrint",          NULL, 1, "",       (void (*)())MACRO_InitMPrint},
-    {"InsertItem",          NULL, 0, "SSSSU",  MACRO_InsertItem},
-    {"InsertMenu",          NULL, 0, "SSU",    MACRO_InsertMenu},
-    {"IfThen",              "IF", 0, "BS",     MACRO_IfThen},
-    {"IfThenElse",          "IE", 0, "BSS",    MACRO_IfThenElse},
-    {"IsBook",              NULL, 1, "",       (void (*)())MACRO_IsBook},
-    {"IsMark",              NULL, 1, "S",      (void (*)())MACRO_IsMark},
-    {"IsNotMark",           "NM", 1, "S",      (void (*)())MACRO_IsNotMark},
-    {"JumpContents",        NULL, 0, "SS",     MACRO_JumpContents},
-    {"JumpContext",         "JC", 0, "SSU",    MACRO_JumpContext},
-    {"JumpHash",            "JH", 0, "SSU",    MACRO_JumpHash},
-    {"JumpHelpOn",          NULL, 0, "",       MACRO_JumpHelpOn},
-    {"JumpID",              "JI", 0, "SSS",    MACRO_JumpID},
-    {"JumpKeyword",         "JK", 0, "SSS",    MACRO_JumpKeyword},
-    {"KLink",               "KL", 0, "SUSS",   MACRO_KLink},
-    {"Menu",                "MU", 0, "",       MACRO_Menu},
-    {"MPrintHash",          NULL, 0, "U",      MACRO_MPrintHash},
-    {"MPrintID",            NULL, 0, "S",      MACRO_MPrintID},
-    {"Next",                NULL, 0, "",       MACRO_Next},
-    {"NoShow",              NULL, 0, "",       MACRO_NoShow},
-    {"PopupContext",        "PC", 0, "SU",     MACRO_PopupContext},
-    {"PopupHash",           NULL, 0, "SU",     MACRO_PopupHash},
-    {"PopupId",             "PI", 0, "SS",     MACRO_PopupId},
-    {"PositionWindow",      "PW", 0, "IIUUUS", MACRO_PositionWindow},
-    {"Prev",                NULL, 0, "",       MACRO_Prev},
-    {"Print",               NULL, 0, "",       MACRO_Print},
-    {"PrinterSetup",        NULL, 0, "",       MACRO_PrinterSetup},
-    {"RegisterRoutine",     "RR", 0, "SSS",    MACRO_RegisterRoutine},
-    {"RemoveAccelerator",   "RA", 0, "UU",     MACRO_RemoveAccelerator},
-    {"ResetMenu",           NULL, 0, "",       MACRO_ResetMenu},
-    {"SaveMark",            NULL, 0, "S",      MACRO_SaveMark},
-    {"Search",              NULL, 0, "",       MACRO_Search},
-    {"SetContents",         NULL, 0, "SU",     MACRO_SetContents},
-    {"SetHelpOnFile",       NULL, 0, "S",      MACRO_SetHelpOnFile},
-    {"SetPopupColor",       "SPC",0, "UUU",    MACRO_SetPopupColor},
-    {"ShellExecute",        "SE", 0, "SSUUSS", MACRO_ShellExecute},
-    {"ShortCut",            "SH", 0, "SSUUS",  MACRO_ShortCut},
-    {"TCard",               NULL, 0, "U",      MACRO_TCard},
-    {"Test",                NULL, 0, "U",      MACRO_Test},
-    {"TestALink",           NULL, 1, "S",      (void (*)())MACRO_TestALink},
-    {"TestKLink",           NULL, 1, "S",      (void (*)())MACRO_TestKLink},
-    {"UncheckItem",         "UI", 0, "S",      MACRO_UncheckItem},
-    {"UpdateWindow",        "UW", 0, "SS",     MACRO_UpdateWindow},
+    {"About",               NULL, 0, "",       (FARPROC)MACRO_About},
+    {"AddAccelerator",      "AA", 0, "UUS",    (FARPROC)MACRO_AddAccelerator},
+    {"ALink",               "AL", 0, "SUS",    (FARPROC)MACRO_ALink},
+    {"Annotate",            NULL, 0, "",       (FARPROC)MACRO_Annotate},
+    {"AppendItem",          NULL, 0, "SSSS",   (FARPROC)MACRO_AppendItem},
+    {"Back",                NULL, 0, "",       (FARPROC)MACRO_Back},
+    {"BackFlush",           "BF", 0, "",       (FARPROC)MACRO_BackFlush},
+    {"BookmarkDefine",      NULL, 0, "",       (FARPROC)MACRO_BookmarkDefine},
+    {"BookmarkMore",        NULL, 0, "",       (FARPROC)MACRO_BookmarkMore},
+    {"BrowseButtons",       NULL, 0, "",       (FARPROC)MACRO_BrowseButtons},
+    {"ChangeButtonBinding", "CBB",0, "SS",     (FARPROC)MACRO_ChangeButtonBinding},
+    {"ChangeEnable",        "CE", 0, "SS",     (FARPROC)MACRO_ChangeEnable},
+    {"ChangeItemBinding",   "CIB",0, "SS",     (FARPROC)MACRO_ChangeItemBinding},
+    {"CheckItem",           "CI", 0, "S",      (FARPROC)MACRO_CheckItem},
+    {"CloseSecondarys",     "CS", 0, "",       (FARPROC)MACRO_CloseSecondarys},
+    {"CloseWindow",         "CW", 0, "S",      (FARPROC)MACRO_CloseWindow},
+    {"Compare",             NULL, 0, "S",      (FARPROC)MACRO_Compare},
+    {"Contents",            NULL, 0, "",       (FARPROC)MACRO_Contents},
+    {"ControlPanel",        NULL, 0, "SSU",    (FARPROC)MACRO_ControlPanel},
+    {"CopyDialog",          NULL, 0, "",       (FARPROC)MACRO_CopyDialog},
+    {"CopyTopic",           "CT", 0, "",       (FARPROC)MACRO_CopyTopic},
+    {"CreateButton",        "CB", 0, "SSS",    (FARPROC)MACRO_CreateButton},
+    {"DeleteItem",          NULL, 0, "S",      (FARPROC)MACRO_DeleteItem},
+    {"DeleteMark",          NULL, 0, "S",      (FARPROC)MACRO_DeleteMark},
+    {"DestroyButton",       NULL, 0, "S",      (FARPROC)MACRO_DestroyButton},
+    {"DisableButton",       "DB", 0, "S",      (FARPROC)MACRO_DisableButton},
+    {"DisableItem",         "DI", 0, "S",      (FARPROC)MACRO_DisableItem},
+    {"EnableButton",        "EB", 0, "S",      (FARPROC)MACRO_EnableButton},
+    {"EnableItem",          "EI", 0, "S",      (FARPROC)MACRO_EnableItem},
+    {"EndMPrint",           NULL, 0, "",       (FARPROC)MACRO_EndMPrint},
+    {"ExecFile",            "EF", 0, "SSUS",   (FARPROC)MACRO_ExecFile},
+    {"ExecProgram",         "EP", 0, "SU",     (FARPROC)MACRO_ExecProgram},
+    {"Exit",                NULL, 0, "",       (FARPROC)MACRO_Exit},
+    {"ExtAbleItem",         NULL, 0, "SU",     (FARPROC)MACRO_ExtAbleItem},
+    {"ExtInsertItem",       NULL, 0, "SSSSUU", (FARPROC)MACRO_ExtInsertItem},
+    {"ExtInsertMenu",       NULL, 0, "SSSUU",  (FARPROC)MACRO_ExtInsertMenu},
+    {"FileExist",           "FE", 1, "S",      (FARPROC)MACRO_FileExist},
+    {"FileOpen",            "FO", 0, "",       (FARPROC)MACRO_FileOpen},
+    {"Find",                NULL, 0, "",       (FARPROC)MACRO_Find},
+    {"Finder",              "FD", 0, "",       (FARPROC)MACRO_Finder},
+    {"FloatingMenu",        NULL, 0, "",       (FARPROC)MACRO_FloatingMenu},
+    {"Flush",               "FH", 0, "",       (FARPROC)MACRO_Flush},
+    {"FocusWindow",         NULL, 0, "S",      (FARPROC)MACRO_FocusWindow},
+    {"Generate",            NULL, 0, "SUU",    (FARPROC)MACRO_Generate},
+    {"GotoMark",            NULL, 0, "S",      (FARPROC)MACRO_GotoMark},
+    {"HelpOn",              NULL, 0, "",       (FARPROC)MACRO_HelpOn},
+    {"HelpOnTop",           NULL, 0, "",       (FARPROC)MACRO_HelpOnTop},
+    {"History",             NULL, 0, "",       (FARPROC)MACRO_History},
+    {"InitMPrint",          NULL, 1, "",       (FARPROC)MACRO_InitMPrint},
+    {"InsertItem",          NULL, 0, "SSSSU",  (FARPROC)MACRO_InsertItem},
+    {"InsertMenu",          NULL, 0, "SSU",    (FARPROC)MACRO_InsertMenu},
+    {"IfThen",              "IF", 0, "BS",     (FARPROC)MACRO_IfThen},
+    {"IfThenElse",          "IE", 0, "BSS",    (FARPROC)MACRO_IfThenElse},
+    {"IsBook",              NULL, 1, "",       (FARPROC)MACRO_IsBook},
+    {"IsMark",              NULL, 1, "S",      (FARPROC)MACRO_IsMark},
+    {"IsNotMark",           "NM", 1, "S",      (FARPROC)MACRO_IsNotMark},
+    {"JumpContents",        NULL, 0, "SS",     (FARPROC)MACRO_JumpContents},
+    {"JumpContext",         "JC", 0, "SSU",    (FARPROC)MACRO_JumpContext},
+    {"JumpHash",            "JH", 0, "SSU",    (FARPROC)MACRO_JumpHash},
+    {"JumpHelpOn",          NULL, 0, "",       (FARPROC)MACRO_JumpHelpOn},
+    {"JumpID",              "JI", 0, "SSS",    (FARPROC)MACRO_JumpID},
+    {"JumpKeyword",         "JK", 0, "SSS",    (FARPROC)MACRO_JumpKeyword},
+    {"KLink",               "KL", 0, "SUSS",   (FARPROC)MACRO_KLink},
+    {"Menu",                "MU", 0, "",       (FARPROC)MACRO_Menu},
+    {"MPrintHash",          NULL, 0, "U",      (FARPROC)MACRO_MPrintHash},
+    {"MPrintID",            NULL, 0, "S",      (FARPROC)MACRO_MPrintID},
+    {"Next",                NULL, 0, "",       (FARPROC)MACRO_Next},
+    {"NoShow",              NULL, 0, "",       (FARPROC)MACRO_NoShow},
+    {"PopupContext",        "PC", 0, "SU",     (FARPROC)MACRO_PopupContext},
+    {"PopupHash",           NULL, 0, "SU",     (FARPROC)MACRO_PopupHash},
+    {"PopupId",             "PI", 0, "SS",     (FARPROC)MACRO_PopupId},
+    {"PositionWindow",      "PW", 0, "IIUUUS", (FARPROC)MACRO_PositionWindow},
+    {"Prev",                NULL, 0, "",       (FARPROC)MACRO_Prev},
+    {"Print",               NULL, 0, "",       (FARPROC)MACRO_Print},
+    {"PrinterSetup",        NULL, 0, "",       (FARPROC)MACRO_PrinterSetup},
+    {"RegisterRoutine",     "RR", 0, "SSS",    (FARPROC)MACRO_RegisterRoutine},
+    {"RemoveAccelerator",   "RA", 0, "UU",     (FARPROC)MACRO_RemoveAccelerator},
+    {"ResetMenu",           NULL, 0, "",       (FARPROC)MACRO_ResetMenu},
+    {"SaveMark",            NULL, 0, "S",      (FARPROC)MACRO_SaveMark},
+    {"Search",              NULL, 0, "",       (FARPROC)MACRO_Search},
+    {"SetContents",         NULL, 0, "SU",     (FARPROC)MACRO_SetContents},
+    {"SetHelpOnFile",       NULL, 0, "S",      (FARPROC)MACRO_SetHelpOnFile},
+    {"SetPopupColor",       "SPC",0, "UUU",    (FARPROC)MACRO_SetPopupColor},
+    {"ShellExecute",        "SE", 0, "SSUUSS", (FARPROC)MACRO_ShellExecute},
+    {"ShortCut",            "SH", 0, "SSUUS",  (FARPROC)MACRO_ShortCut},
+    {"TCard",               NULL, 0, "U",      (FARPROC)MACRO_TCard},
+    {"Test",                NULL, 0, "U",      (FARPROC)MACRO_Test},
+    {"TestALink",           NULL, 1, "S",      (FARPROC)MACRO_TestALink},
+    {"TestKLink",           NULL, 1, "S",      (FARPROC)MACRO_TestKLink},
+    {"UncheckItem",         "UI", 0, "S",      (FARPROC)MACRO_UncheckItem},
+    {"UpdateWindow",        "UW", 0, "SS",     (FARPROC)MACRO_UpdateWindow},
     {NULL,                  NULL, 0, NULL,     NULL}
 };
 
@@ -154,16 +154,8 @@
         if (strcasecmp(md->name, name) == 0 || (md->alias != NULL && strcasecmp(md->alias, name) == 0))
         {
             lr->proto = md->arguments;
-            if (md->isBool)
-            {
-                lr->bool_function = (BOOL (*)())md->fn;
-                return BOOL_FUNCTION;
-            }
-            else
-            {
-                lr->void_function = md->fn;
-                return VOID_FUNCTION;
-            }
+            lr->function = md->fn;
+            return md->isBool ? BOOL_FUNCTION : VOID_FUNCTION;
         }
     }
     return EMPTY;
@@ -184,7 +176,7 @@
 
 /*******      helper functions     *******/
 
-WINHELP_BUTTON**        MACRO_LookupButton(WINHELP_WINDOW* win, LPCSTR name)
+static WINHELP_BUTTON**        MACRO_LookupButton(WINHELP_WINDOW* win, LPCSTR name)
 {
     WINHELP_BUTTON**    b;
 
@@ -195,32 +187,32 @@
 
 /******* real macro implementation *******/
 
-void MACRO_About(void)
+void CALLBACK MACRO_About(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_AddAccelerator(LONG u1, LONG u2, LPCSTR str)
+void CALLBACK MACRO_AddAccelerator(LONG u1, LONG u2, LPCSTR str)
 {
     WINE_FIXME("(%lu, %lu, \"%s\")\n", u1, u2, str);
 }
 
-void MACRO_ALink(LPCSTR str1, LONG u, LPCSTR str2)
+void CALLBACK MACRO_ALink(LPCSTR str1, LONG u, LPCSTR str2)
 {
     WINE_FIXME("(\"%s\", %lu, \"%s\")\n", str1, u, str2);
 }
 
-void MACRO_Annotate(void)
+void CALLBACK MACRO_Annotate(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_AppendItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4)
+void CALLBACK MACRO_AppendItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4)
 {
     WINE_FIXME("(\"%s\", \"%s\", \"%s\", \"%s\")\n", str1, str2, str3, str4);
 }
 
-void MACRO_Back(void)
+void CALLBACK MACRO_Back(void)
 {
     WINHELP_WINDOW* win = Globals.active_win;
 
@@ -231,7 +223,7 @@
                                  win->info, SW_SHOW);
 }
 
-void MACRO_BackFlush(void)
+void CALLBACK MACRO_BackFlush(void)
 {
     WINHELP_WINDOW* win = Globals.active_win;
 
@@ -250,17 +242,17 @@
     }
 }
 
-void MACRO_BookmarkDefine(void)
+void CALLBACK MACRO_BookmarkDefine(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_BookmarkMore(void)
+void CALLBACK MACRO_BookmarkMore(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_BrowseButtons(void)
+void CALLBACK MACRO_BrowseButtons(void)
 {
     WINE_TRACE("()\n");
 
@@ -268,7 +260,7 @@
     MACRO_CreateButton("BTN_NEXT", "&>>", "Next()");
 }
 
-void MACRO_ChangeButtonBinding(LPCSTR id, LPCSTR macro)
+void CALLBACK MACRO_ChangeButtonBinding(LPCSTR id, LPCSTR macro)
 {
     WINHELP_WINDOW*     win = Globals.active_win;
     WINHELP_BUTTON*     button;
@@ -293,15 +285,15 @@
 
     ptr = (char*)button + sizeof(WINHELP_BUTTON);
 
-    lstrcpy(ptr, (LPSTR) id);
+    lstrcpy(ptr, id);
     button->lpszID = ptr;
     ptr += lstrlen(id) + 1;
 
-    lstrcpy(ptr, (LPSTR) (*b)->lpszName);
+    lstrcpy(ptr, (*b)->lpszName);
     button->lpszName = ptr;
     ptr += lstrlen((*b)->lpszName) + 1;
 
-    lstrcpy(ptr, (LPSTR) macro);
+    lstrcpy(ptr, macro);
     button->lpszMacro = ptr;
 
     *b = button;
@@ -309,7 +301,7 @@
     SendMessage(win->hMainWnd, WM_USER, 0, 0);
 }
 
-void MACRO_ChangeEnable(LPCSTR id, LPCSTR macro)
+void CALLBACK MACRO_ChangeEnable(LPCSTR id, LPCSTR macro)
 {
     WINE_TRACE("(\"%s\", \"%s\")\n", id, macro);
 
@@ -317,17 +309,17 @@
     MACRO_EnableButton(id);
 }
 
-void MACRO_ChangeItemBinding(LPCSTR str1, LPCSTR str2)
+void CALLBACK MACRO_ChangeItemBinding(LPCSTR str1, LPCSTR str2)
 {
     WINE_FIXME("(\"%s\", \"%s\")\n", str1, str2);
 }
 
-void MACRO_CheckItem(LPCSTR str)
+void CALLBACK MACRO_CheckItem(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_CloseSecondarys(void)
+void CALLBACK MACRO_CloseSecondarys(void)
 {
     WINHELP_WINDOW *win;
 
@@ -337,7 +329,7 @@
             DestroyWindow(win->hMainWnd);
 }
 
-void MACRO_CloseWindow(LPCSTR lpszWindow)
+void CALLBACK MACRO_CloseWindow(LPCSTR lpszWindow)
 {
     WINHELP_WINDOW *win;
 
@@ -350,12 +342,12 @@
             DestroyWindow(win->hMainWnd);
 }
 
-void MACRO_Compare(LPCSTR str)
+void CALLBACK MACRO_Compare(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_Contents(void)
+void CALLBACK MACRO_Contents(void)
 {
     WINE_TRACE("()\n");
 
@@ -363,22 +355,22 @@
         MACRO_JumpContents(Globals.active_win->page->file->lpszPath, NULL);
 }
 
-void MACRO_ControlPanel(LPCSTR str1, LPCSTR str2, LONG u)
+void CALLBACK MACRO_ControlPanel(LPCSTR str1, LPCSTR str2, LONG u)
 {
     WINE_FIXME("(\"%s\", \"%s\", %lu)\n", str1, str2, u);
 }
 
-void MACRO_CopyDialog(void)
+void CALLBACK MACRO_CopyDialog(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_CopyTopic(void)
+void CALLBACK MACRO_CopyTopic(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_CreateButton(LPCSTR id, LPCSTR name, LPCSTR macro)
+void CALLBACK MACRO_CreateButton(LPCSTR id, LPCSTR name, LPCSTR macro)
 {
     WINHELP_WINDOW *win = Globals.active_win;
     WINHELP_BUTTON *button, **b;
@@ -397,15 +389,15 @@
 
     ptr = (char*)button + sizeof(WINHELP_BUTTON);
 
-    lstrcpy(ptr, (LPSTR) id);
+    lstrcpy(ptr, id);
     button->lpszID = ptr;
     ptr += lstrlen(id) + 1;
 
-    lstrcpy(ptr, (LPSTR) name);
+    lstrcpy(ptr, name);
     button->lpszName = ptr;
     ptr += lstrlen(name) + 1;
 
-    lstrcpy(ptr, (LPSTR) macro);
+    lstrcpy(ptr, macro);
     button->lpszMacro = ptr;
 
     button->wParam = WH_FIRST_BUTTON;
@@ -416,22 +408,22 @@
     SendMessage(win->hMainWnd, WM_USER, 0, 0);
 }
 
-void MACRO_DeleteItem(LPCSTR str)
+void CALLBACK MACRO_DeleteItem(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_DeleteMark(LPCSTR str)
+void CALLBACK MACRO_DeleteMark(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_DestroyButton(LPCSTR str)
+void CALLBACK MACRO_DestroyButton(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_DisableButton(LPCSTR id)
+void CALLBACK MACRO_DisableButton(LPCSTR id)
 {
     WINHELP_BUTTON**    b;
 
@@ -443,12 +435,12 @@
     EnableWindow((*b)->hWnd, FALSE);
 }
 
-void MACRO_DisableItem(LPCSTR str)
+void CALLBACK MACRO_DisableItem(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_EnableButton(LPCSTR id)
+void CALLBACK MACRO_EnableButton(LPCSTR id)
 {
     WINHELP_BUTTON**    b;
 
@@ -460,27 +452,27 @@
     EnableWindow((*b)->hWnd, TRUE);
 }
 
-void MACRO_EnableItem(LPCSTR str)
+void CALLBACK MACRO_EnableItem(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_EndMPrint(void)
+void CALLBACK MACRO_EndMPrint(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_ExecFile(LPCSTR str1, LPCSTR str2, LONG u, LPCSTR str3)
+void CALLBACK MACRO_ExecFile(LPCSTR str1, LPCSTR str2, LONG u, LPCSTR str3)
 {
     WINE_FIXME("(\"%s\", \"%s\", %lu, \"%s\")\n", str1, str2, u, str3);
 }
 
-void MACRO_ExecProgram(LPCSTR str, LONG u)
+void CALLBACK MACRO_ExecProgram(LPCSTR str, LONG u)
 {
     WINE_FIXME("(\"%s\", %lu)\n", str, u);
 }
 
-void MACRO_Exit(void)
+void CALLBACK MACRO_Exit(void)
 {
     WINE_TRACE("()\n");
 
@@ -488,28 +480,28 @@
         DestroyWindow(Globals.win_list->hMainWnd);
 }
 
-void MACRO_ExtAbleItem(LPCSTR str, LONG u)
+void CALLBACK MACRO_ExtAbleItem(LPCSTR str, LONG u)
 {
     WINE_FIXME("(\"%s\", %lu)\n", str, u);
 }
 
-void MACRO_ExtInsertItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4, LONG u1, LONG u2)
+void CALLBACK MACRO_ExtInsertItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4, LONG u1, LONG u2)
 {
     WINE_FIXME("(\"%s\", \"%s\", \"%s\", \"%s\", %lu, %lu)\n", str1, str2, str3, str4, u1, u2);
 }
 
-void MACRO_ExtInsertMenu(LPCSTR str1, LPCSTR str2, LPCSTR str3, LONG u1, LONG u2)
+void CALLBACK MACRO_ExtInsertMenu(LPCSTR str1, LPCSTR str2, LPCSTR str3, LONG u1, LONG u2)
 {
     WINE_FIXME("(\"%s\", \"%s\", \"%s\", %lu, %lu)\n", str1, str2, str3, u1, u2);
 }
 
-BOOL MACRO_FileExist(LPCSTR str)
+BOOL CALLBACK MACRO_FileExist(LPCSTR str)
 {
     WINE_TRACE("(\"%s\")\n", str);
     return GetFileAttributes(str) != INVALID_FILE_ATTRIBUTES;
 }
 
-void MACRO_FileOpen(void)
+void CALLBACK MACRO_FileOpen(void)
 {
     OPENFILENAME openfilename;
     CHAR szPath[MAX_PATHNAME_LEN];
@@ -563,27 +555,27 @@
     }
 }
 
-void MACRO_Find(void)
+void CALLBACK MACRO_Find(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_Finder(void)
+void CALLBACK MACRO_Finder(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_FloatingMenu(void)
+void CALLBACK MACRO_FloatingMenu(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_Flush(void)
+void CALLBACK MACRO_Flush(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_FocusWindow(LPCSTR lpszWindow)
+void CALLBACK MACRO_FocusWindow(LPCSTR lpszWindow)
 {
     WINHELP_WINDOW *win;
 
@@ -596,28 +588,28 @@
             SetFocus(win->hMainWnd);
 }
 
-void MACRO_Generate(LPCSTR str, LONG w, LONG l)
+void CALLBACK MACRO_Generate(LPCSTR str, LONG w, LONG l)
 {
     WINE_FIXME("(\"%s\", %lx, %lx)\n", str, w, l);
 }
 
-void MACRO_GotoMark(LPCSTR str)
+void CALLBACK MACRO_GotoMark(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_HelpOn(void)
+void CALLBACK MACRO_HelpOn(void)
 {
     WINE_TRACE("()\n");
     MACRO_JumpContents((Globals.wVersion > 4) ? "winhelp32.hlp" : "winhelp.hlp", NULL);
 }
 
-void MACRO_HelpOnTop(void)
+void CALLBACK MACRO_HelpOnTop(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_History(void)
+void CALLBACK MACRO_History(void)
 {
     WINE_TRACE("()\n");
 
@@ -629,51 +621,51 @@
     }
 }
 
-void MACRO_IfThen(BOOL b, LPCSTR t)
+void CALLBACK MACRO_IfThen(BOOL b, LPCSTR t)
 {
     if (b) MACRO_ExecuteMacro(t);
 }
 
-void MACRO_IfThenElse(BOOL b, LPCSTR t, LPCSTR f)
+void CALLBACK MACRO_IfThenElse(BOOL b, LPCSTR t, LPCSTR f)
 {
     if (b) MACRO_ExecuteMacro(t); else MACRO_ExecuteMacro(f);
 }
 
-BOOL MACRO_InitMPrint(void)
+BOOL CALLBACK MACRO_InitMPrint(void)
 {
     WINE_FIXME("()\n");
     return FALSE;
 }
 
-void MACRO_InsertItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4, LONG u)
+void CALLBACK MACRO_InsertItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4, LONG u)
 {
     WINE_FIXME("(\"%s\", \"%s\", \"%s\", \"%s\", %lu)\n", str1, str2, str3, str4, u);
 }
 
-void MACRO_InsertMenu(LPCSTR str1, LPCSTR str2, LONG u)
+void CALLBACK MACRO_InsertMenu(LPCSTR str1, LPCSTR str2, LONG u)
 {
     WINE_FIXME("(\"%s\", \"%s\", %lu)\n", str1, str2, u);
 }
 
-BOOL MACRO_IsBook(void)
+BOOL CALLBACK MACRO_IsBook(void)
 {
     WINE_TRACE("()\n");
     return Globals.isBook;
 }
 
-BOOL MACRO_IsMark(LPCSTR str)
+BOOL CALLBACK MACRO_IsMark(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
     return FALSE;
 }
 
-BOOL MACRO_IsNotMark(LPCSTR str)
+BOOL CALLBACK MACRO_IsNotMark(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
     return TRUE;
 }
 
-void MACRO_JumpContents(LPCSTR lpszPath, LPCSTR lpszWindow)
+void CALLBACK MACRO_JumpContents(LPCSTR lpszPath, LPCSTR lpszWindow)
 {
     HLPFILE*    hlpfile;
 
@@ -684,13 +676,13 @@
                                    SW_NORMAL);
 }
 
-void MACRO_JumpContext(LPCSTR lpszPath, LPCSTR lpszWindow, LONG context)
+void CALLBACK MACRO_JumpContext(LPCSTR lpszPath, LPCSTR lpszWindow, LONG context)
 {
     WINE_FIXME("(\"%s\", \"%s\", %ld)semi-stub\n", lpszPath, lpszWindow, context);
     return MACRO_JumpContents(lpszPath, lpszWindow);
 }
 
-void MACRO_JumpHash(LPCSTR lpszPath, LPCSTR lpszWindow, LONG lHash)
+void CALLBACK MACRO_JumpHash(LPCSTR lpszPath, LPCSTR lpszWindow, LONG lHash)
 {
     HLPFILE*    hlpfile;
 
@@ -701,7 +693,7 @@
                                    SW_NORMAL);
 }
 
-void MACRO_JumpHelpOn(void)
+void CALLBACK MACRO_JumpHelpOn(void)
 {
     WINE_FIXME("()\n");
 }
@@ -709,38 +701,38 @@
 /* FIXME: those two macros are wrong
  * they should only contain 2 strings, path & window are coded as path>window
  */
-void MACRO_JumpID(LPCSTR lpszPath, LPCSTR lpszWindow, LPCSTR topic_id)
+void CALLBACK MACRO_JumpID(LPCSTR lpszPath, LPCSTR lpszWindow, LPCSTR topic_id)
 {
     WINE_TRACE("(\"%s\", \"%s\", \"%s\")\n", lpszPath, lpszWindow, topic_id);
     MACRO_JumpHash(lpszPath, lpszWindow, HLPFILE_Hash(topic_id));
 }
 
-void MACRO_JumpKeyword(LPCSTR lpszPath, LPCSTR lpszWindow, LPCSTR keyword)
+void CALLBACK MACRO_JumpKeyword(LPCSTR lpszPath, LPCSTR lpszWindow, LPCSTR keyword)
 {
     WINE_FIXME("(\"%s\", \"%s\", \"%s\")\n", lpszPath, lpszWindow, keyword);
 }
 
-void MACRO_KLink(LPCSTR str1, LONG u, LPCSTR str2, LPCSTR str3)
+void CALLBACK MACRO_KLink(LPCSTR str1, LONG u, LPCSTR str2, LPCSTR str3)
 {
     WINE_FIXME("(\"%s\", %lu, \"%s\", \"%s\")\n", str1, u, str2, str3);
 }
 
-void MACRO_Menu(void)
+void CALLBACK MACRO_Menu(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_MPrintHash(LONG u)
+void CALLBACK MACRO_MPrintHash(LONG u)
 {
     WINE_FIXME("(%lu)\n", u);
 }
 
-void MACRO_MPrintID(LPCSTR str)
+void CALLBACK MACRO_MPrintID(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_Next(void)
+void CALLBACK MACRO_Next(void)
 {
     HLPFILE_PAGE*   page;
 
@@ -754,32 +746,32 @@
     }
 }
 
-void MACRO_NoShow(void)
+void CALLBACK MACRO_NoShow(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_PopupContext(LPCSTR str, LONG u)
+void CALLBACK MACRO_PopupContext(LPCSTR str, LONG u)
 {
     WINE_FIXME("(\"%s\", %lu)\n", str, u);
 }
 
-void MACRO_PopupHash(LPCSTR str, LONG u)
+void CALLBACK MACRO_PopupHash(LPCSTR str, LONG u)
 {
     WINE_FIXME("(\"%s\", %lu)\n", str, u);
 }
 
-void MACRO_PopupId(LPCSTR str1, LPCSTR str2)
+void CALLBACK MACRO_PopupId(LPCSTR str1, LPCSTR str2)
 {
     WINE_FIXME("(\"%s\", \"%s\")\n", str1, str2);
 }
 
-void MACRO_PositionWindow(LONG i1, LONG i2, LONG u1, LONG u2, LONG u3, LPCSTR str)
+void CALLBACK MACRO_PositionWindow(LONG i1, LONG i2, LONG u1, LONG u2, LONG u3, LPCSTR str)
 {
     WINE_FIXME("(%li, %li, %lu, %lu, %lu, \"%s\")\n", i1, i2, u1, u2, u3, str);
 }
 
-void MACRO_Prev(void)
+void CALLBACK MACRO_Prev(void)
 {
     HLPFILE_PAGE*   page;
 
@@ -793,7 +785,7 @@
     }
 }
 
-void MACRO_Print(void)
+void CALLBACK MACRO_Print(void)
 {
     PRINTDLG printer;
 
@@ -824,33 +816,62 @@
     }
 }
 
-void MACRO_PrinterSetup(void)
+void CALLBACK MACRO_PrinterSetup(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_RegisterRoutine(LPCSTR dll, LPCSTR proc, LPCSTR args)
+void CALLBACK MACRO_RegisterRoutine(LPCSTR dll_name, LPCSTR proc, LPCSTR args)
 {
-    HANDLE      hLib;
-    void        (*fn)();
-    int         size;
+    FARPROC             fn = NULL;
+    int                 size;
+    WINHELP_DLL*        dll;
 
-    WINE_TRACE("(\"%s\", \"%s\", \"%s\")\n", dll, proc, args);
+    WINE_TRACE("(\"%s\", \"%s\", \"%s\")\n", dll_name, proc, args);
 
-    if ((hLib = LoadLibrary(dll)) == NULL)
+    /* FIXME: are the registered DLLs global or linked to the current file ???
+     * We assume globals (as we did for macros, but is this really the case ???)
+     */
+    for (dll = Globals.dlls; dll; dll = dll->next)
+    {
+        if (!strcmp(dll->name, dll_name)) break;
+    }
+    if (!dll)
+    {
+        HANDLE hLib = LoadLibrary(dll_name);
+
+        /* FIXME: the library will not be unloaded until exit of program 
+         * We don't send the DW_TERM message
+         */
+        WINE_TRACE("Loading %s\n", dll_name);
+        /* FIXME: should look in the directory where current hlpfile
+         * is loaded from
+         */
+        if (hLib == NULL)
+        {
+            /* FIXME: internationalisation for error messages */
+            WINE_FIXME("Cannot find dll %s\n", dll_name);
+        }
+        else if ((dll = HeapAlloc(GetProcessHeap(), 0, sizeof(*dll))))
+        {
+            dll->hLib = hLib;
+            dll->name = strdup(dll_name); /* FIXME */
+            dll->next = Globals.dlls;
+            Globals.dlls = dll;
+            dll->handler = (WINHELP_LDLLHandler)GetProcAddress(dll->hLib, "LDLLHandler");
+            dll->class = dll->handler ? (dll->handler)(DW_WHATMSG, 0, 0) : DC_NOMSG;
+            WINE_TRACE("Got class %lx for DLL %s\n", dll->class, dll_name);
+            if (dll->class & DC_INITTERM) dll->handler(DW_INIT, 0, 0);
+            if (dll->class & DC_CALLBACKS) dll->handler(DW_CALLBACKS, (DWORD)Callbacks, 0);
+        }
+        else WINE_WARN("OOM\n");
+    }
+    if (dll && !(fn = GetProcAddress(dll->hLib, proc)))
     {
         /* FIXME: internationalisation for error messages */
-        WINE_FIXME("Cannot find dll %s\n", dll);
-        fn = NULL;
-    }
-    else if (!(fn = (void (*)())GetProcAddress(hLib, proc)))
-    {
-        /* FIXME: internationalisation for error messages */
-        WINE_FIXME("Cannot find proc %s in dll %s\n", dll, proc);
-        fn = NULL;
+        WINE_FIXME("Cannot find proc %s in dll %s\n", dll_name, proc);
     }
 
-    /* FIXME: the library will not be unloaded until exit of program */
     size = ++MACRO_NumLoaded * sizeof(struct MacroDesc);
     if (!MACRO_Loaded) MACRO_Loaded = HeapAlloc(GetProcessHeap(), 0, size);
     else MACRO_Loaded = HeapReAlloc(GetProcessHeap(), 0, MACRO_Loaded, size);
@@ -859,81 +880,82 @@
     MACRO_Loaded[MACRO_NumLoaded - 1].isBool    = 0;
     MACRO_Loaded[MACRO_NumLoaded - 1].arguments = strdup(args); /* FIXME */
     MACRO_Loaded[MACRO_NumLoaded - 1].fn        = fn;
+    WINE_TRACE("Added %s(%s) at %p\n", proc, args, fn);
 }
 
-void MACRO_RemoveAccelerator(LONG u1, LONG u2)
+void CALLBACK MACRO_RemoveAccelerator(LONG u1, LONG u2)
 {
     WINE_FIXME("(%lu, %lu)\n", u1, u2);
 }
 
-void MACRO_ResetMenu(void)
+void CALLBACK MACRO_ResetMenu(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_SaveMark(LPCSTR str)
+void CALLBACK MACRO_SaveMark(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_Search(void)
+void CALLBACK MACRO_Search(void)
 {
     WINE_FIXME("()\n");
 }
 
-void MACRO_SetContents(LPCSTR str, LONG u)
+void CALLBACK MACRO_SetContents(LPCSTR str, LONG u)
 {
     WINE_FIXME("(\"%s\", %lu)\n", str, u);
 }
 
-void MACRO_SetHelpOnFile(LPCSTR str)
+void CALLBACK MACRO_SetHelpOnFile(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_SetPopupColor(LONG u1, LONG u2, LONG u3)
+void CALLBACK MACRO_SetPopupColor(LONG u1, LONG u2, LONG u3)
 {
     WINE_FIXME("(%lu, %lu, %lu)\n", u1, u2, u3);
 }
 
-void MACRO_ShellExecute(LPCSTR str1, LPCSTR str2, LONG u1, LONG u2, LPCSTR str3, LPCSTR str4)
+void CALLBACK MACRO_ShellExecute(LPCSTR str1, LPCSTR str2, LONG u1, LONG u2, LPCSTR str3, LPCSTR str4)
 {
     WINE_FIXME("(\"%s\", \"%s\", %lu, %lu, \"%s\", \"%s\")\n", str1, str2, u1, u2, str3, str4);
 }
 
-void MACRO_ShortCut(LPCSTR str1, LPCSTR str2, LONG w, LONG l, LPCSTR str)
+void CALLBACK MACRO_ShortCut(LPCSTR str1, LPCSTR str2, LONG w, LONG l, LPCSTR str)
 {
     WINE_FIXME("(\"%s\", \"%s\", %lx, %lx, \"%s\")\n", str1, str2, w, l, str);
 }
 
-void MACRO_TCard(LONG u)
+void CALLBACK MACRO_TCard(LONG u)
 {
     WINE_FIXME("(%lu)\n", u);
 }
 
-void MACRO_Test(LONG u)
+void CALLBACK MACRO_Test(LONG u)
 {
     WINE_FIXME("(%lu)\n", u);
 }
 
-BOOL MACRO_TestALink(LPCSTR str)
+BOOL CALLBACK MACRO_TestALink(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
     return FALSE;
 }
 
-BOOL MACRO_TestKLink(LPCSTR str)
+BOOL CALLBACK MACRO_TestKLink(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
     return FALSE;
 }
 
-void MACRO_UncheckItem(LPCSTR str)
+void CALLBACK MACRO_UncheckItem(LPCSTR str)
 {
     WINE_FIXME("(\"%s\")\n", str);
 }
 
-void MACRO_UpdateWindow(LPCSTR str1, LPCSTR str2)
+void CALLBACK MACRO_UpdateWindow(LPCSTR str1, LPCSTR str2)
 {
     WINE_FIXME("(\"%s\", \"%s\")\n", str1, str2);
 }
diff --git a/programs/winhelp/macro.h b/programs/winhelp/macro.h
index 49eb6d9..fb031de 100644
--- a/programs/winhelp/macro.h
+++ b/programs/winhelp/macro.h
@@ -29,8 +29,7 @@
   BOOL          bool;
   LONG          integer;
   LPCSTR        string;
-  BOOL          (*bool_function)();
-  void          (*void_function)();
+  FARPROC       function;
 };
 
 extern struct lexret yylval;
@@ -39,97 +38,97 @@
 int  MACRO_Lookup(const char* name, struct lexret* lr);
 
 enum token_types {EMPTY, VOID_FUNCTION, BOOL_FUNCTION, INTEGER, STRING, IDENTIFIER};
-void MACRO_About(void);
-void MACRO_AddAccelerator(LONG, LONG, LPCSTR);
-void MACRO_ALink(LPCSTR, LONG, LPCSTR);
-void MACRO_Annotate(void);
-void MACRO_AppendItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR);
-void MACRO_Back(void);
-void MACRO_BackFlush(void);
-void MACRO_BookmarkDefine(void);
-void MACRO_BookmarkMore(void);
-void MACRO_BrowseButtons(void);
-void MACRO_ChangeButtonBinding(LPCSTR, LPCSTR);
-void MACRO_ChangeEnable(LPCSTR, LPCSTR);
-void MACRO_ChangeItemBinding(LPCSTR, LPCSTR);
-void MACRO_CheckItem(LPCSTR);
-void MACRO_CloseSecondarys(void);
-void MACRO_CloseWindow(LPCSTR);
-void MACRO_Compare(LPCSTR);
-void MACRO_Contents(void);
-void MACRO_ControlPanel(LPCSTR, LPCSTR, LONG);
-void MACRO_CopyDialog(void);
-void MACRO_CopyTopic(void);
-void MACRO_CreateButton(LPCSTR, LPCSTR, LPCSTR);
-void MACRO_DeleteItem(LPCSTR);
-void MACRO_DeleteMark(LPCSTR);
-void MACRO_DestroyButton(LPCSTR);
-void MACRO_DisableButton(LPCSTR);
-void MACRO_DisableItem(LPCSTR);
-void MACRO_EnableButton(LPCSTR);
-void MACRO_EnableItem(LPCSTR);
-void MACRO_EndMPrint(void);
-void MACRO_ExecFile(LPCSTR, LPCSTR, LONG, LPCSTR);
-void MACRO_ExecProgram(LPCSTR, LONG);
-void MACRO_Exit(void);
-void MACRO_ExtAbleItem(LPCSTR, LONG);
-void MACRO_ExtInsertItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR, LONG, LONG);
-void MACRO_ExtInsertMenu(LPCSTR, LPCSTR, LPCSTR, LONG, LONG);
-BOOL MACRO_FileExist(LPCSTR);
-void MACRO_FileOpen(void);
-void MACRO_Find(void);
-void MACRO_Finder(void);
-void MACRO_FloatingMenu(void);
-void MACRO_Flush(void);
-void MACRO_FocusWindow(LPCSTR);
-void MACRO_Generate(LPCSTR, LONG, LONG);
-void MACRO_GotoMark(LPCSTR);
-void MACRO_HelpOn(void);
-void MACRO_HelpOnTop(void);
-void MACRO_History(void);
-void MACRO_IfThen(BOOL, LPCSTR);
-void MACRO_IfThenElse(BOOL, LPCSTR, LPCSTR);
-BOOL MACRO_InitMPrint(void);
-void MACRO_InsertItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR, LONG);
-void MACRO_InsertMenu(LPCSTR, LPCSTR, LONG);
-BOOL MACRO_IsBook(void);
-BOOL MACRO_IsMark(LPCSTR);
-BOOL MACRO_IsNotMark(LPCSTR);
-void MACRO_JumpContents(LPCSTR, LPCSTR);
-void MACRO_JumpContext(LPCSTR, LPCSTR, LONG);
-void MACRO_JumpHash(LPCSTR, LPCSTR, LONG);
-void MACRO_JumpHelpOn(void);
-void MACRO_JumpID(LPCSTR, LPCSTR, LPCSTR);
-void MACRO_JumpKeyword(LPCSTR, LPCSTR, LPCSTR);
-void MACRO_KLink(LPCSTR, LONG, LPCSTR, LPCSTR);
-void MACRO_Menu(void);
-void MACRO_MPrintHash(LONG);
-void MACRO_MPrintID(LPCSTR);
-void MACRO_Next(void);
-void MACRO_NoShow(void);
-void MACRO_PopupContext(LPCSTR, LONG);
-void MACRO_PopupHash(LPCSTR, LONG);
-void MACRO_PopupId(LPCSTR, LPCSTR);
-void MACRO_PositionWindow(LONG, LONG, LONG, LONG, LONG, LPCSTR);
-void MACRO_Prev(void);
-void MACRO_Print(void);
-void MACRO_PrinterSetup(void);
-void MACRO_RegisterRoutine(LPCSTR, LPCSTR, LPCSTR);
-void MACRO_RemoveAccelerator(LONG, LONG);
-void MACRO_ResetMenu(void);
-void MACRO_SaveMark(LPCSTR);
-void MACRO_Search(void);
-void MACRO_SetContents(LPCSTR, LONG);
-void MACRO_SetHelpOnFile(LPCSTR);
-void MACRO_SetPopupColor(LONG, LONG, LONG);
-void MACRO_ShellExecute(LPCSTR, LPCSTR, LONG, LONG, LPCSTR, LPCSTR);
-void MACRO_ShortCut(LPCSTR, LPCSTR, LONG, LONG, LPCSTR);
-void MACRO_TCard(LONG);
-void MACRO_Test(LONG);
-BOOL MACRO_TestALink(LPCSTR);
-BOOL MACRO_TestKLink(LPCSTR);
-void MACRO_UncheckItem(LPCSTR);
-void MACRO_UpdateWindow(LPCSTR, LPCSTR);
+void CALLBACK MACRO_About(void);
+void CALLBACK MACRO_AddAccelerator(LONG, LONG, LPCSTR);
+void CALLBACK MACRO_ALink(LPCSTR, LONG, LPCSTR);
+void CALLBACK MACRO_Annotate(void);
+void CALLBACK MACRO_AppendItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR);
+void CALLBACK MACRO_Back(void);
+void CALLBACK MACRO_BackFlush(void);
+void CALLBACK MACRO_BookmarkDefine(void);
+void CALLBACK MACRO_BookmarkMore(void);
+void CALLBACK MACRO_BrowseButtons(void);
+void CALLBACK MACRO_ChangeButtonBinding(LPCSTR, LPCSTR);
+void CALLBACK MACRO_ChangeEnable(LPCSTR, LPCSTR);
+void CALLBACK MACRO_ChangeItemBinding(LPCSTR, LPCSTR);
+void CALLBACK MACRO_CheckItem(LPCSTR);
+void CALLBACK MACRO_CloseSecondarys(void);
+void CALLBACK MACRO_CloseWindow(LPCSTR);
+void CALLBACK MACRO_Compare(LPCSTR);
+void CALLBACK MACRO_Contents(void);
+void CALLBACK MACRO_ControlPanel(LPCSTR, LPCSTR, LONG);
+void CALLBACK MACRO_CopyDialog(void);
+void CALLBACK MACRO_CopyTopic(void);
+void CALLBACK MACRO_CreateButton(LPCSTR, LPCSTR, LPCSTR);
+void CALLBACK MACRO_DeleteItem(LPCSTR);
+void CALLBACK MACRO_DeleteMark(LPCSTR);
+void CALLBACK MACRO_DestroyButton(LPCSTR);
+void CALLBACK MACRO_DisableButton(LPCSTR);
+void CALLBACK MACRO_DisableItem(LPCSTR);
+void CALLBACK MACRO_EnableButton(LPCSTR);
+void CALLBACK MACRO_EnableItem(LPCSTR);
+void CALLBACK MACRO_EndMPrint(void);
+void CALLBACK MACRO_ExecFile(LPCSTR, LPCSTR, LONG, LPCSTR);
+void CALLBACK MACRO_ExecProgram(LPCSTR, LONG);
+void CALLBACK MACRO_Exit(void);
+void CALLBACK MACRO_ExtAbleItem(LPCSTR, LONG);
+void CALLBACK MACRO_ExtInsertItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR, LONG, LONG);
+void CALLBACK MACRO_ExtInsertMenu(LPCSTR, LPCSTR, LPCSTR, LONG, LONG);
+BOOL CALLBACK MACRO_FileExist(LPCSTR);
+void CALLBACK MACRO_FileOpen(void);
+void CALLBACK MACRO_Find(void);
+void CALLBACK MACRO_Finder(void);
+void CALLBACK MACRO_FloatingMenu(void);
+void CALLBACK MACRO_Flush(void);
+void CALLBACK MACRO_FocusWindow(LPCSTR);
+void CALLBACK MACRO_Generate(LPCSTR, LONG, LONG);
+void CALLBACK MACRO_GotoMark(LPCSTR);
+void CALLBACK MACRO_HelpOn(void);
+void CALLBACK MACRO_HelpOnTop(void);
+void CALLBACK MACRO_History(void);
+void CALLBACK MACRO_IfThen(BOOL, LPCSTR);
+void CALLBACK MACRO_IfThenElse(BOOL, LPCSTR, LPCSTR);
+BOOL CALLBACK MACRO_InitMPrint(void);
+void CALLBACK MACRO_InsertItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR, LONG);
+void CALLBACK MACRO_InsertMenu(LPCSTR, LPCSTR, LONG);
+BOOL CALLBACK MACRO_IsBook(void);
+BOOL CALLBACK MACRO_IsMark(LPCSTR);
+BOOL CALLBACK MACRO_IsNotMark(LPCSTR);
+void CALLBACK MACRO_JumpContents(LPCSTR, LPCSTR);
+void CALLBACK MACRO_JumpContext(LPCSTR, LPCSTR, LONG);
+void CALLBACK MACRO_JumpHash(LPCSTR, LPCSTR, LONG);
+void CALLBACK MACRO_JumpHelpOn(void);
+void CALLBACK MACRO_JumpID(LPCSTR, LPCSTR, LPCSTR);
+void CALLBACK MACRO_JumpKeyword(LPCSTR, LPCSTR, LPCSTR);
+void CALLBACK MACRO_KLink(LPCSTR, LONG, LPCSTR, LPCSTR);
+void CALLBACK MACRO_Menu(void);
+void CALLBACK MACRO_MPrintHash(LONG);
+void CALLBACK MACRO_MPrintID(LPCSTR);
+void CALLBACK MACRO_Next(void);
+void CALLBACK MACRO_NoShow(void);
+void CALLBACK MACRO_PopupContext(LPCSTR, LONG);
+void CALLBACK MACRO_PopupHash(LPCSTR, LONG);
+void CALLBACK MACRO_PopupId(LPCSTR, LPCSTR);
+void CALLBACK MACRO_PositionWindow(LONG, LONG, LONG, LONG, LONG, LPCSTR);
+void CALLBACK MACRO_Prev(void);
+void CALLBACK MACRO_Print(void);
+void CALLBACK MACRO_PrinterSetup(void);
+void CALLBACK MACRO_RegisterRoutine(LPCSTR, LPCSTR, LPCSTR);
+void CALLBACK MACRO_RemoveAccelerator(LONG, LONG);
+void CALLBACK MACRO_ResetMenu(void);
+void CALLBACK MACRO_SaveMark(LPCSTR);
+void CALLBACK MACRO_Search(void);
+void CALLBACK MACRO_SetContents(LPCSTR, LONG);
+void CALLBACK MACRO_SetHelpOnFile(LPCSTR);
+void CALLBACK MACRO_SetPopupColor(LONG, LONG, LONG);
+void CALLBACK MACRO_ShellExecute(LPCSTR, LPCSTR, LONG, LONG, LPCSTR, LPCSTR);
+void CALLBACK MACRO_ShortCut(LPCSTR, LPCSTR, LONG, LONG, LPCSTR);
+void CALLBACK MACRO_TCard(LONG);
+void CALLBACK MACRO_Test(LONG);
+BOOL CALLBACK MACRO_TestALink(LPCSTR);
+BOOL CALLBACK MACRO_TestKLink(LPCSTR);
+void CALLBACK MACRO_UncheckItem(LPCSTR);
+void CALLBACK MACRO_UpdateWindow(LPCSTR, LPCSTR);
 
 /* Local Variables:    */
 /* c-file-style: "GNU" */
diff --git a/programs/winhelp/macro.lex.l b/programs/winhelp/macro.lex.l
index 4a9d0ae..a20caa3 100644
--- a/programs/winhelp/macro.lex.l
+++ b/programs/winhelp/macro.lex.l
@@ -132,7 +132,7 @@
     }
 }
 
-static int MACRO_CallBoolFunc(BOOL (*fn)(), const char* args, void** ret);
+static int MACRO_CallBoolFunc(FARPROC fn, const char* args, void** ret);
 
 /******************************************************************
  *		MACRO_CheckArgs
@@ -173,7 +173,7 @@
             case 'B':
                 if (t != BOOL_FUNCTION) 
                 {WINE_WARN("missing B\n");return -1;}   
-                if (MACRO_CallBoolFunc(yylval.bool_function, yylval.proto, &pa[idx]) == 0)
+                if (MACRO_CallBoolFunc(yylval.function, yylval.proto, &pa[idx]) == 0)
                     return -1;
                 break;
             default: 
@@ -196,7 +196,7 @@
  * Invokes boolean function fn, which arguments are defined by args
  * stores bool result into ret
  */
-static int MACRO_CallBoolFunc(BOOL (*fn)(), const char* args, void** ret)
+static int MACRO_CallBoolFunc(FARPROC fn, const char* args, void** ret)
 {
     void*       pa[2];
     int         idx = MACRO_CheckArgs(pa, sizeof(pa)/sizeof(pa[0]), args);
@@ -221,7 +221,7 @@
  *
  *
  */
-static int MACRO_CallVoidFunc(void (*fn)(), const char* args)
+static int MACRO_CallVoidFunc(FARPROC fn, const char* args)
 {
     void*       pa[6];
     int         idx = MACRO_CheckArgs(pa, sizeof(pa)/sizeof(pa[0]), args);
@@ -229,7 +229,7 @@
     if (idx == -1) return 0;
     if (!fn)       return 1;
 
-    WINE_TRACE("calling with %u pmts\n", idx);
+    WINE_TRACE("calling %p with %u pmts\n", fn, idx);
 
     switch (idx)
     {
@@ -260,7 +260,7 @@
         {
         case VOID_FUNCTION:
             WINE_TRACE("got type void func(%s)\n", yylval.proto);
-            MACRO_CallVoidFunc(yylval.void_function, yylval.proto);
+            MACRO_CallVoidFunc(yylval.function, yylval.proto);
             break;
         case BOOL_FUNCTION:
             WINE_WARN("got type bool func(%s)\n", yylval.proto);
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 6879b67..9f06bc9 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -54,7 +54,7 @@
 static void    WINHELP_SetupText(HWND hWnd);
 static WINHELP_LINE_PART* WINHELP_IsOverLink(WINHELP_WINDOW*, WPARAM, LPARAM);
 
-WINHELP_GLOBALS Globals = {3, 0, 0, 0, 1, 0, 0, NULL};
+WINHELP_GLOBALS Globals = {3, NULL, NULL, 0, TRUE, NULL, NULL, NULL, NULL};
 
 /***********************************************************************
  *
@@ -129,7 +129,7 @@
  *
  *
  */
-HLPFILE_WINDOWINFO*     WINHELP_GetPopupWindowInfo(HLPFILE* hlpfile, HWND hParentWnd, POINT* mouse)
+static HLPFILE_WINDOWINFO*     WINHELP_GetPopupWindowInfo(HLPFILE* hlpfile, HWND hParentWnd, POINT* mouse)
 {
     static      HLPFILE_WINDOWINFO      wi;
 
@@ -165,6 +165,7 @@
     LONG        lHash = 0;
     HLPFILE*    hlpfile;
     CHAR*       quote;
+    WINHELP_DLL*        dll;
 
     Globals.hInstance = hInstance;
     
@@ -205,7 +206,12 @@
     }
 
     /* Create primary window */
-    WINHELP_RegisterWinClasses();
+    if (!WINHELP_RegisterWinClasses())
+    {
+        WINE_FIXME("Couldn't register classes\n");
+        return 0;
+    }
+
     if (*cmdline)
     {
         if ((*cmdline == '"') && (quote = strchr(cmdline+1, '"')))
@@ -226,6 +232,10 @@
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
+    for (dll = Globals.dlls; dll; dll = dll->next)
+    {
+        if (dll->class & DC_INITTERM) dll->handler(DW_TERM, 0, 0);
+    }
     return 0;
 }
 
@@ -473,7 +483,7 @@
                     sizeof(WINHELP_WINDOW) + strlen(wi->name) + 1);
     if (!win) return FALSE;
 
-    win->next  = Globals.win_list;
+    win->next = Globals.win_list;
     Globals.win_list = win;
 
     win->lpszName = (char*)win + sizeof(WINHELP_WINDOW);
@@ -544,9 +554,10 @@
     }
 
     hWnd = CreateWindow(bPopup ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
-                        wi->caption, wi->win_style,
+                        wi->caption, 
+                        bPrimary ? WS_OVERLAPPEDWINDOW : wi->win_style,
                         wi->origin.x, wi->origin.y, wi->size.cx, wi->size.cy,
-                        0, bPrimary ? LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU)) : 0,
+                        NULL, bPrimary ? LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU)) : 0,
                         Globals.hInstance, win);
 
     ShowWindow(hWnd, nCmdShow);
@@ -965,7 +976,7 @@
 	    if (CurPos > Max)
                 CurPos = Max;
 	    else if (CurPos < Min)
-                CurPos = Min;		    
+                CurPos = Min;
 	    dy = GetScrollPos(hWnd, SB_VERT) - CurPos;
 	    SetScrollPos(hWnd, SB_VERT, CurPos, TRUE);
 	    ScrollWindow(hWnd, 0, dy, NULL, NULL);
diff --git a/programs/winhelp/winhelp.h b/programs/winhelp/winhelp.h
index 64304ff..fb08a55 100644
--- a/programs/winhelp/winhelp.h
+++ b/programs/winhelp/winhelp.h
@@ -122,6 +122,36 @@
     struct tagWinHelp*  next;
 } WINHELP_WINDOW;
 
+#define DC_NOMSG     0x00000000
+#define DC_MINMAX    0x00000001
+#define DC_INITTERM  0x00000002
+#define DC_JUMP      0x00000004
+#define DC_ACTIVATE  0x00000008
+#define DC_CALLBACKS 0x00000010
+
+#define DW_NOTUSED    0
+#define DW_WHATMSG    1
+#define DW_MINMAX     2
+#define DW_SIZE       3
+#define DW_INIT       4
+#define DW_TERM       5
+#define DW_STARTJUMP  6
+#define DW_ENDJUMP    7
+#define DW_CHGFILE    8
+#define DW_ACTIVATE   9
+#define	DW_CALLBACKS 10
+
+typedef long (CALLBACK *WINHELP_LDLLHandler)(WORD, LONG, LONG);
+
+typedef struct tagDll
+{
+    HANDLE              hLib;
+    const char*         name;
+    WINHELP_LDLLHandler handler;
+    DWORD               class;
+    struct tagDll*      next;
+} WINHELP_DLL;
+
 typedef struct
 {
     UINT                wVersion;
@@ -132,9 +162,11 @@
     WINHELP_WINDOW*     active_win;
     WINHELP_WINDOW*     win_list;
     WNDPROC             button_proc;
+    WINHELP_DLL*        dlls;
 } WINHELP_GLOBALS;
 
 extern WINHELP_GLOBALS Globals;
+extern FARPROC         Callbacks[];
 
 BOOL WINHELP_CreateHelpWindowByHash(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int);
 BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE*, HLPFILE_WINDOWINFO*, int);