Added global subclassing atom, used by tooltips and updown (not yet).

diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c
index ef26815..1e6e760 100644
--- a/dlls/comctl32/commctrl.c
+++ b/dlls/comctl32/commctrl.c
@@ -35,10 +35,11 @@
 
 HANDLE32 COMCTL32_hHeap = (HANDLE32)NULL;
 DWORD    COMCTL32_dwProcessesAttached = 0;
+LPSTR    COMCTL32_aSubclass = (LPSTR)NULL;
 
 
 /***********************************************************************
- * ComCtl32LibMain [Internal] Initializes the internal 'COMCTL32.DLL'.
+ * COMCTL32_LibMain [Internal] Initializes the internal 'COMCTL32.DLL'.
  *
  * PARAMS
  *     hinstDLL    [I] handle to the 'dlls' instance
@@ -51,7 +52,7 @@
  */
 
 BOOL32 WINAPI
-ComCtl32LibMain (HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+COMCTL32_LibMain (HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
     TRACE (commctrl, "%x,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
 
@@ -62,6 +63,11 @@
 		COMCTL32_hHeap = HeapCreate (0, 0x10000, 0);
 		TRACE (commctrl, "Heap created: 0x%x\n", COMCTL32_hHeap);
 
+		/* add global subclassing atom (used by 'tooltip' and 'updown') */
+		COMCTL32_aSubclass = (LPSTR)(DWORD)GlobalAddAtom32A ("CC32SubclassInfo");
+		TRACE (commctrl, "Subclassing atom added: %p\n",
+		       COMCTL32_aSubclass);
+
 		/* register all Win95 common control classes */
 		ANIMATE_Register ();
 		HEADER_Register ();
@@ -103,6 +109,12 @@
 		TREEVIEW_Unregister ();
 		UPDOWN_Unregister ();
 
+		/* delete global subclassing atom */
+		GlobalDeleteAtom (LOWORD(COMCTL32_aSubclass));
+		TRACE (commctrl, "Subclassing atom deleted: %p\n",
+		       COMCTL32_aSubclass);
+		COMCTL32_aSubclass = (LPSTR)NULL;
+
 		/* destroy private heap */
 		HeapDestroy (COMCTL32_hHeap);
 		TRACE (commctrl, "Heap destroyed: 0x%x\n", COMCTL32_hHeap);
@@ -845,3 +857,4 @@
 
     return S_OK;
 }
+
diff --git a/dlls/comctl32/tooltips.c b/dlls/comctl32/tooltips.c
index fd98f63..2cf2aa9 100644
--- a/dlls/comctl32/tooltips.c
+++ b/dlls/comctl32/tooltips.c
@@ -24,8 +24,11 @@
 #define ID_TIMERPOP    2    /* auto pop timer */
 #define ID_TIMERLEAVE  3    /* tool leave timer */
 
+
+extern LPSTR COMCTL32_aSubclass; /* global subclassing atom */
+
 /* property name of tooltip window handle */
-#define TT_SUBCLASS_PROP "CC32SubclassInfo"
+//#define TT_SUBCLASS_PROP "CC32SubclassInfo"
 
 #define TOOLTIPS_GetInfoPtr(wndPtr) ((TOOLTIPS_INFO *)wndPtr->wExtra[0])
 
@@ -55,7 +58,7 @@
     oldBkMode = SetBkMode32 (hdc, TRANSPARENT);
     SetTextColor32 (hdc, infoPtr->clrText);
     hOldFont = SelectObject32 (hdc, infoPtr->hFont);
-    DrawText32A (hdc, infoPtr->szTipText, -1, &rc, uFlags);
+    DrawText32W (hdc, infoPtr->szTipText, -1, &rc, uFlags);
     SelectObject32 (hdc, hOldFont);
     if (oldBkMode != TRANSPARENT)
 	SetBkMode32 (hdc, oldBkMode);
@@ -68,13 +71,14 @@
     TTTOOL_INFO *toolPtr = &infoPtr->tools[nTool];
 
     if ((toolPtr->hinst) && (HIWORD((UINT32)toolPtr->lpszText) == 0)) {
-	TRACE (tooltips, "get res string %x %x\n",
+	/* load a resource */
+	TRACE (tooltips, "load res string %x %x\n",
 	       toolPtr->hinst, (int)toolPtr->lpszText);
-	LoadString32A (toolPtr->hinst, (UINT32)toolPtr->lpszText,
+	LoadString32W (toolPtr->hinst, (UINT32)toolPtr->lpszText,
 		       infoPtr->szTipText, INFOTIPSIZE);
     }
     else if (toolPtr->lpszText) {
-	if (toolPtr->lpszText == LPSTR_TEXTCALLBACK32A) {
+	if (toolPtr->lpszText == LPSTR_TEXTCALLBACK32W) {
 	    NMTTDISPINFO32A ttnmdi;
 
 	    /* fill NMHDR struct */
@@ -82,7 +86,7 @@
 	    ttnmdi.hdr.hwndFrom = wndPtr->hwndSelf;
 	    ttnmdi.hdr.idFrom = toolPtr->uId;
 	    ttnmdi.hdr.code = TTN_GETDISPINFO32A;
-	    ttnmdi.lpszText = infoPtr->szTipText;
+	    ttnmdi.lpszText = (LPSTR)&ttnmdi.szText;
 	    ttnmdi.uFlags = toolPtr->uFlags;
 	    ttnmdi.lParam = toolPtr->lParam;
 
@@ -91,35 +95,33 @@
 			    (WPARAM32)toolPtr->uId, (LPARAM)&ttnmdi);
 
 	    if ((ttnmdi.hinst) && (HIWORD((UINT32)ttnmdi.szText) == 0)) {
-		LoadString32A (ttnmdi.hinst, (UINT32)ttnmdi.szText,
+		LoadString32W (ttnmdi.hinst, (UINT32)ttnmdi.szText,
 			       infoPtr->szTipText, INFOTIPSIZE);
 		if (ttnmdi.uFlags & TTF_DI_SETITEM) {
 		    toolPtr->hinst = ttnmdi.hinst;
-		    toolPtr->lpszText = ttnmdi.szText;
+		    toolPtr->lpszText = (LPWSTR)ttnmdi.szText;
 		}
 	    }
 	    else if (ttnmdi.szText[0]) {
-		lstrcpyn32A (infoPtr->szTipText, ttnmdi.szText, 80);
+		lstrcpynAtoW (infoPtr->szTipText, ttnmdi.szText, 80);
 		if (ttnmdi.uFlags & TTF_DI_SETITEM) {
-		    INT32 len = lstrlen32A (ttnmdi.szText) + 1;
+		    INT32 len = lstrlen32A (ttnmdi.szText);
 		    toolPtr->hinst = 0;
-		    toolPtr->lpszText =	COMCTL32_Alloc (len);
-		    lstrcpy32A (toolPtr->lpszText, ttnmdi.szText);
+		    toolPtr->lpszText =	COMCTL32_Alloc ((len+1)* sizeof(WCHAR));
+		    lstrcpyAtoW (toolPtr->lpszText, ttnmdi.szText);
 		}
 	    }
 	    else if (ttnmdi.lpszText == 0) {
 		/* no text available */
-		infoPtr->szTipText[0] = '\0';
+		infoPtr->szTipText[0] = L'\0';
 	    }
 	    else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACK32A) {
-		if (ttnmdi.lpszText != infoPtr->szTipText)
-		    lstrcpyn32A (infoPtr->szTipText, ttnmdi.lpszText,
-				 INFOTIPSIZE);
+		lstrcpynAtoW (infoPtr->szTipText, ttnmdi.lpszText, INFOTIPSIZE);
 		if (ttnmdi.uFlags & TTF_DI_SETITEM) {
-		    INT32 len = lstrlen32A (ttnmdi.lpszText) + 1;
+		    INT32 len = lstrlen32A (ttnmdi.lpszText);
 		    toolPtr->hinst = 0;
-		    toolPtr->lpszText =	COMCTL32_Alloc (len);
-		    lstrcpy32A (toolPtr->lpszText, ttnmdi.lpszText);
+		    toolPtr->lpszText =	COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+		    lstrcpyAtoW (toolPtr->lpszText, ttnmdi.lpszText);
 		}
 	    }
 	    else {
@@ -127,14 +129,17 @@
 		infoPtr->szTipText[0] = '\0';
 	    }
 	}
-	else
-	    lstrcpyn32A (infoPtr->szTipText, toolPtr->lpszText, INFOTIPSIZE);
+	else {
+	    /* the item is a usual (unicode) text */
+	    lstrcpyn32W (infoPtr->szTipText, toolPtr->lpszText, INFOTIPSIZE);
+	}
     }
-    else
+    else {
 	/* no text available */
-	infoPtr->szTipText[0] = '\0';
+	infoPtr->szTipText[0] = L'\0';
+    }
 
-    TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
+    TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText));
 }
 
 
@@ -152,11 +157,11 @@
     }
     if (wndPtr->dwStyle & TTS_NOPREFIX)
 	uFlags |= DT_NOPREFIX;
-    TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
+    TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText));
 
     hdc = GetDC32 (wndPtr->hwndSelf);
     hOldFont = SelectObject32 (hdc, infoPtr->hFont);
-    DrawText32A (hdc, infoPtr->szTipText, -1, &rc, uFlags);
+    DrawText32W (hdc, infoPtr->szTipText, -1, &rc, uFlags);
     SelectObject32 (hdc, hOldFont);
     ReleaseDC32 (wndPtr->hwndSelf, hdc);
 
@@ -186,7 +191,7 @@
 
     TOOLTIPS_GetTipText (wndPtr, infoPtr, infoPtr->nCurrentTool);
 
-    if (infoPtr->szTipText[0] == '\0') {
+    if (infoPtr->szTipText[0] == L'\0') {
 	infoPtr->nCurrentTool = -1;
 	return;
     }
@@ -200,7 +205,7 @@
     SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
 		    (WPARAM32)toolPtr->uId, (LPARAM)&hdr);
 
-    TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
+    TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText));
 
     TOOLTIPS_CalcTipSize (wndPtr, infoPtr, &size);
     TRACE (tooltips, "size %d - %d\n", size.cx, size.cy);
@@ -282,7 +287,7 @@
 
     TOOLTIPS_GetTipText (wndPtr, infoPtr, infoPtr->nTrackTool);
 
-    if (infoPtr->szTipText[0] == '\0') {
+    if (infoPtr->szTipText[0] == L'\0') {
 	infoPtr->nTrackTool = -1;
 	return;
     }
@@ -296,7 +301,7 @@
     SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
 		    (WPARAM32)toolPtr->uId, (LPARAM)&hdr);
 
-    TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
+    TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText));
 
     TOOLTIPS_CalcTipSize (wndPtr, infoPtr, &size);
     TRACE (tooltips, "size %d - %d\n", size.cx, size.cy);
@@ -398,6 +403,33 @@
 
 
 static INT32
+TOOLTIPS_GetToolFromInfoW (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFO32W lpToolInfo)
+{
+    TTTOOL_INFO *toolPtr;
+    INT32 nTool;
+
+    for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
+	toolPtr = &infoPtr->tools[nTool];
+
+	if (!(toolPtr->uFlags & TTF_IDISHWND) && 
+	    (lpToolInfo->hwnd == toolPtr->hwnd) &&
+	    (lpToolInfo->uId == toolPtr->uId))
+	    return nTool;
+    }
+
+    for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
+	toolPtr = &infoPtr->tools[nTool];
+
+	if ((toolPtr->uFlags & TTF_IDISHWND) &&
+	    (lpToolInfo->uId == toolPtr->uId))
+	    return nTool;
+    }
+
+    return -1;
+}
+
+
+static INT32
 TOOLTIPS_GetToolFromPoint (TOOLTIPS_INFO *infoPtr, HWND32 hwnd, LPPOINT32 lpPt)
 {
     TTTOOL_INFO *toolPtr;
@@ -543,18 +575,18 @@
 
     if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)) {
 	TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText);
-	toolPtr->lpszText = lpToolInfo->lpszText;
+	toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
     }
     else if (lpToolInfo->lpszText) {
 	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A) {
 	    TRACE (tooltips, "add CALLBACK!\n");
-	    toolPtr->lpszText = lpToolInfo->lpszText;
+	    toolPtr->lpszText = LPSTR_TEXTCALLBACK32W;
 	}
 	else {
 	    INT32 len = lstrlen32A (lpToolInfo->lpszText);
 	    TRACE (tooltips, "add text \"%s\"!\n", lpToolInfo->lpszText);
-	    toolPtr->lpszText =	COMCTL32_Alloc (len + 1);
-	    lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
+	    toolPtr->lpszText =	COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));
+	    lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText);
 	}
     }
 
@@ -565,7 +597,7 @@
     if (toolPtr->uFlags & TTF_SUBCLASS) {
 	if (toolPtr->uFlags & TTF_IDISHWND) {
 	    LPTT_SUBCLASS_INFO lpttsi =
-		(LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
+		(LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
 	    if (lpttsi == NULL) {
 		lpttsi =
 		    (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO));
@@ -574,7 +606,7 @@
 		    GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc);
 		lpttsi->hwndToolTip = wndPtr->hwndSelf;
 		lpttsi->uRefCount++;
-		SetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP,
+		SetProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass,
 			    (HANDLE32)lpttsi);
 	    }
 	    else
@@ -582,7 +614,7 @@
 	}
 	else {
 	    LPTT_SUBCLASS_INFO lpttsi =
-		(LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
+		(LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, COMCTL32_aSubclass);
 	    if (lpttsi == NULL) {
 		lpttsi =
 		    (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO));
@@ -591,7 +623,7 @@
 		    GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc);
 		lpttsi->hwndToolTip = wndPtr->hwndSelf;
 		lpttsi->uRefCount++;
-		SetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP, (HANDLE32)lpttsi);
+		SetProp32A (toolPtr->hwnd, COMCTL32_aSubclass, (HANDLE32)lpttsi);
 	    }
 	    else
 		lpttsi->uRefCount++;
@@ -603,7 +635,106 @@
 }
 
 
-// << TOOLTIPS_AddTool32W >>
+static LRESULT
+TOOLTIPS_AddTool32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTTOOLINFO32W lpToolInfo = (LPTTTOOLINFO32W)lParam;
+    TTTOOL_INFO *toolPtr;
+
+    if (lpToolInfo == NULL)
+	return FALSE;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return FALSE;
+
+    TRACE (tooltips, "add tool (%x) %x %d%s!\n",
+	   wndPtr->hwndSelf, lpToolInfo->hwnd, lpToolInfo->uId,
+	   (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
+
+    if (infoPtr->uNumTools == 0) {
+	infoPtr->tools = COMCTL32_Alloc (sizeof(TTTOOL_INFO));
+	toolPtr = infoPtr->tools;
+    }
+    else {
+	TTTOOL_INFO *oldTools = infoPtr->tools;
+	infoPtr->tools =
+	    COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1));
+	memcpy (infoPtr->tools, oldTools,
+		infoPtr->uNumTools * sizeof(TTTOOL_INFO));
+	COMCTL32_Free (oldTools);
+	toolPtr = &infoPtr->tools[infoPtr->uNumTools];
+    }
+
+    infoPtr->uNumTools++;
+
+    /* copy tool data */
+    toolPtr->uFlags = lpToolInfo->uFlags;
+    toolPtr->hwnd   = lpToolInfo->hwnd;
+    toolPtr->uId    = lpToolInfo->uId;
+    toolPtr->rect   = lpToolInfo->rect;
+    toolPtr->hinst  = lpToolInfo->hinst;
+
+    if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)) {
+	TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText);
+	toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
+    }
+    else if (lpToolInfo->lpszText) {
+	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32W) {
+	    TRACE (tooltips, "add CALLBACK!\n");
+	    toolPtr->lpszText = LPSTR_TEXTCALLBACK32W;
+	}
+	else {
+	    INT32 len = lstrlen32W (lpToolInfo->lpszText);
+	    TRACE (tooltips, "add text \"%s\"!\n",
+		   debugstr_w(lpToolInfo->lpszText));
+	    toolPtr->lpszText =	COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));
+	    lstrcpy32W (toolPtr->lpszText, lpToolInfo->lpszText);
+	}
+    }
+
+    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32W))
+	toolPtr->lParam = lpToolInfo->lParam;
+
+    /* install subclassing hook */
+    if (toolPtr->uFlags & TTF_SUBCLASS) {
+	if (toolPtr->uFlags & TTF_IDISHWND) {
+	    LPTT_SUBCLASS_INFO lpttsi =
+		(LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
+	    if (lpttsi == NULL) {
+		lpttsi =
+		    (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO));
+		lpttsi->wpOrigProc = 
+		    (WNDPROC32)SetWindowLong32A ((HWND32)toolPtr->uId,
+		    GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc);
+		lpttsi->hwndToolTip = wndPtr->hwndSelf;
+		lpttsi->uRefCount++;
+		SetProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass,
+			    (HANDLE32)lpttsi);
+	    }
+	    else
+		WARN (tooltips, "A window tool must only be listed once!\n");
+	}
+	else {
+	    LPTT_SUBCLASS_INFO lpttsi =
+		(LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, COMCTL32_aSubclass);
+	    if (lpttsi == NULL) {
+		lpttsi =
+		    (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO));
+		lpttsi->wpOrigProc = 
+		    (WNDPROC32)SetWindowLong32A (toolPtr->hwnd,
+		    GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc);
+		lpttsi->hwndToolTip = wndPtr->hwndSelf;
+		lpttsi->uRefCount++;
+		SetProp32A (toolPtr->hwnd, COMCTL32_aSubclass, (HANDLE32)lpttsi);
+	    }
+	    else
+		lpttsi->uRefCount++;
+	}
+	TRACE (tooltips, "subclassing installed!\n");
+    }
+
+    return TRUE;
+}
 
 
 static LRESULT
@@ -629,7 +760,7 @@
     /* delete text string */
     toolPtr = &infoPtr->tools[nTool]; 
     if ((toolPtr->hinst) && (toolPtr->lpszText)) {
-	if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32A)
+	if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32W)
 	    COMCTL32_Free (toolPtr->lpszText);
     }
 
@@ -637,11 +768,11 @@
     if (toolPtr->uFlags & TTF_SUBCLASS) {
 	if (toolPtr->uFlags & TTF_IDISHWND) {
 	    LPTT_SUBCLASS_INFO lpttsi =
-		(LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
+		(LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
 	    if (lpttsi) {
 		SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
 				  (LONG)lpttsi->wpOrigProc);
-		RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
+		RemoveProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
 		COMCTL32_Free (&lpttsi);
 	    }
 	    else
@@ -649,12 +780,12 @@
 	}
 	else {
 	    LPTT_SUBCLASS_INFO lpttsi =
-		(LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
+		(LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, COMCTL32_aSubclass);
 	    if (lpttsi) {
 		if (lpttsi->uRefCount == 1) {
 		    SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
 				      (LONG)lpttsi->wpOrigProc);
-		    RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
+		    RemoveProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
 		    COMCTL32_Free (&lpttsi);
 		}
 		else
@@ -692,7 +823,90 @@
 }
 
 
-// << TOOLTIPS_DelTool32W >>
+static LRESULT
+TOOLTIPS_DelTool32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTTOOLINFO32W lpToolInfo = (LPTTTOOLINFO32W)lParam;
+    TTTOOL_INFO *toolPtr;
+    INT32 nTool;
+
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return 0;
+    if (infoPtr->uNumTools == 0)
+	return 0;
+
+    nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
+    if (nTool == -1) return 0;
+
+    TRACE (tooltips, "tool %d\n", nTool);
+
+    /* delete text string */
+    toolPtr = &infoPtr->tools[nTool]; 
+    if ((toolPtr->hinst) && (toolPtr->lpszText)) {
+	if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32W)
+	    COMCTL32_Free (toolPtr->lpszText);
+    }
+
+    /* remove subclassing */
+    if (toolPtr->uFlags & TTF_SUBCLASS) {
+	if (toolPtr->uFlags & TTF_IDISHWND) {
+	    LPTT_SUBCLASS_INFO lpttsi =
+		(LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
+	    if (lpttsi) {
+		SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
+				  (LONG)lpttsi->wpOrigProc);
+		RemoveProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
+		COMCTL32_Free (&lpttsi);
+	    }
+	    else
+		ERR (tooltips, "Invalid data handle!\n");
+	}
+	else {
+	    LPTT_SUBCLASS_INFO lpttsi =
+		(LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, COMCTL32_aSubclass);
+	    if (lpttsi) {
+		if (lpttsi->uRefCount == 1) {
+		    SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
+				      (LONG)lpttsi->wpOrigProc);
+		    RemoveProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
+		    COMCTL32_Free (&lpttsi);
+		}
+		else
+		    lpttsi->uRefCount--;
+	    }
+	    else
+		ERR (tooltips, "Invalid data handle!\n");
+	}
+    }
+
+    /* delete tool from tool list */
+    if (infoPtr->uNumTools == 1) {
+	COMCTL32_Free (infoPtr->tools);
+	infoPtr->tools = NULL;
+    }
+    else {
+	TTTOOL_INFO *oldTools = infoPtr->tools;
+	infoPtr->tools =
+	    COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1));
+
+	if (nTool > 0)
+	    memcpy (&infoPtr->tools[0], &oldTools[0],
+		    nTool * sizeof(TTTOOL_INFO));
+
+	if (nTool < infoPtr->uNumTools - 1)
+	    memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1],
+		    (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO));
+
+	COMCTL32_Free (oldTools);
+    }
+
+    infoPtr->uNumTools--;
+
+    return 0;
+}
 
 
 static LRESULT
@@ -720,7 +934,8 @@
     lpToolInfo->uId      = toolPtr->uId;
     lpToolInfo->rect     = toolPtr->rect;
     lpToolInfo->hinst    = toolPtr->hinst;
-    lpToolInfo->lpszText = toolPtr->lpszText;
+//    lpToolInfo->lpszText = toolPtr->lpszText;
+    lpToolInfo->lpszText = NULL;  /* FIXME */
 
     if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
 	lpToolInfo->lParam = toolPtr->lParam;
@@ -729,7 +944,39 @@
 }
 
 
-// << TOOLTIPS_EnumTools32W >>
+static LRESULT
+TOOLTIPS_EnumTools32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    UINT32 uIndex = (UINT32)wParam;
+    LPTTTOOLINFO32W lpToolInfo = (LPTTTOOLINFO32W)lParam;
+    TTTOOL_INFO *toolPtr;
+
+    if (lpToolInfo == NULL)
+	return FALSE;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return FALSE;
+    if (uIndex >= infoPtr->uNumTools)
+	return FALSE;
+
+    TRACE (tooltips, "index=%u\n", uIndex);
+
+    toolPtr = &infoPtr->tools[uIndex];
+
+    /* copy tool data */
+    lpToolInfo->uFlags   = toolPtr->uFlags;
+    lpToolInfo->hwnd     = toolPtr->hwnd;
+    lpToolInfo->uId      = toolPtr->uId;
+    lpToolInfo->rect     = toolPtr->rect;
+    lpToolInfo->hinst    = toolPtr->hinst;
+//    lpToolInfo->lpszText = toolPtr->lpszText;
+    lpToolInfo->lpszText = NULL;  /* FIXME */
+
+    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32W))
+	lpToolInfo->lParam = toolPtr->lParam;
+
+    return TRUE;
+}
 
 
 static LRESULT
@@ -752,7 +999,8 @@
 	    lpToolInfo->uFlags   = toolPtr->uFlags;
 	    lpToolInfo->rect     = toolPtr->rect;
 	    lpToolInfo->hinst    = toolPtr->hinst;
-	    lpToolInfo->lpszText = toolPtr->lpszText;
+//	    lpToolInfo->lpszText = toolPtr->lpszText;
+	    lpToolInfo->lpszText = NULL;  /* FIXME */
 
 	    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
 		lpToolInfo->lParam = toolPtr->lParam;
@@ -769,7 +1017,42 @@
 }
 
 
-// << TOOLTIPS_GetCurrentTool32W >>
+static LRESULT
+TOOLTIPS_GetCurrentTool32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTTOOLINFO32W lpToolInfo = (LPTTTOOLINFO32W)lParam;
+    TTTOOL_INFO *toolPtr;
+
+    if (lpToolInfo == NULL)
+	return FALSE;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return FALSE;
+
+    if (lpToolInfo) {
+	if (infoPtr->nCurrentTool > -1) {
+	    toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
+
+	    /* copy tool data */
+	    lpToolInfo->uFlags   = toolPtr->uFlags;
+	    lpToolInfo->rect     = toolPtr->rect;
+	    lpToolInfo->hinst    = toolPtr->hinst;
+//	    lpToolInfo->lpszText = toolPtr->lpszText;
+	    lpToolInfo->lpszText = NULL;  /* FIXME */
+
+	    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32W))
+		lpToolInfo->lParam = toolPtr->lParam;
+
+	    return TRUE;
+	}
+	else
+	    return FALSE;
+    }
+    else
+	return (infoPtr->nCurrentTool != -1);
+
+    return FALSE;
+}
 
 
 static LRESULT
@@ -834,13 +1117,31 @@
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
 
-    lstrcpy32A (lpToolInfo->lpszText, infoPtr->tools[nTool].lpszText);
+    lstrcpyWtoA (lpToolInfo->lpszText, infoPtr->tools[nTool].lpszText);
 
     return 0;
 }
 
 
-// << TOOLTIPS_GetText32W >>
+static LRESULT
+TOOLTIPS_GetText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTTOOLINFO32W lpToolInfo = (LPTTTOOLINFO32W)lParam;
+    INT32 nTool;
+
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return 0;
+
+    nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
+    if (nTool == -1) return 0;
+
+    lstrcpy32W (lpToolInfo->lpszText, infoPtr->tools[nTool].lpszText);
+
+    return 0;
+}
 
 
 __inline__ static LRESULT
@@ -883,7 +1184,8 @@
 	return FALSE;
 
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
-    if (nTool == -1) return FALSE;
+    if (nTool == -1)
+	return FALSE;
 
     TRACE (tooltips, "tool %d\n", nTool);
 
@@ -893,7 +1195,8 @@
     lpToolInfo->uFlags   = toolPtr->uFlags;
     lpToolInfo->rect     = toolPtr->rect;
     lpToolInfo->hinst    = toolPtr->hinst;
-    lpToolInfo->lpszText = toolPtr->lpszText;
+//    lpToolInfo->lpszText = toolPtr->lpszText;
+    lpToolInfo->lpszText = NULL;  /* FIXME */
 
     if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
 	lpToolInfo->lParam = toolPtr->lParam;
@@ -902,7 +1205,41 @@
 }
 
 
-// << TOOLTIPS_GetToolInfo32W >>
+static LRESULT
+TOOLTIPS_GetToolInfo32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTTOOLINFO32W lpToolInfo = (LPTTTOOLINFO32W)lParam;
+    TTTOOL_INFO *toolPtr;
+    INT32 nTool;
+
+    if (lpToolInfo == NULL)
+	return FALSE;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return FALSE;
+    if (infoPtr->uNumTools == 0)
+	return FALSE;
+
+    nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
+    if (nTool == -1)
+	return FALSE;
+
+    TRACE (tooltips, "tool %d\n", nTool);
+
+    toolPtr = &infoPtr->tools[nTool];
+
+    /* copy tool data */
+    lpToolInfo->uFlags   = toolPtr->uFlags;
+    lpToolInfo->rect     = toolPtr->rect;
+    lpToolInfo->hinst    = toolPtr->hinst;
+//    lpToolInfo->lpszText = toolPtr->lpszText;
+    lpToolInfo->lpszText = NULL;  /* FIXME */
+
+    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32W))
+	lpToolInfo->lParam = toolPtr->lParam;
+
+    return TRUE;
+}
 
 
 static LRESULT
@@ -923,21 +1260,56 @@
     TRACE (tooltips, "tool %d!\n", nTool);
 
     /* copy tool data */
-    toolPtr = &infoPtr->tools[nTool];
-    lptthit->ti.cbSize   = sizeof(TTTOOLINFO32A);
-    lptthit->ti.uFlags   = toolPtr->uFlags;
-    lptthit->ti.hwnd     = toolPtr->hwnd;
-    lptthit->ti.uId      = toolPtr->uId;
-    lptthit->ti.rect     = toolPtr->rect;
-    lptthit->ti.hinst    = toolPtr->hinst;
-    lptthit->ti.lpszText = toolPtr->lpszText;
-    lptthit->ti.lParam   = toolPtr->lParam;
+    if (lptthit->ti.cbSize >= sizeof(TTTOOLINFO32A)) {
+	toolPtr = &infoPtr->tools[nTool];
+
+	lptthit->ti.uFlags   = toolPtr->uFlags;
+	lptthit->ti.hwnd     = toolPtr->hwnd;
+	lptthit->ti.uId      = toolPtr->uId;
+	lptthit->ti.rect     = toolPtr->rect;
+	lptthit->ti.hinst    = toolPtr->hinst;
+//	lptthit->ti.lpszText = toolPtr->lpszText;
+	lptthit->ti.lpszText = NULL;  /* FIXME */
+	lptthit->ti.lParam   = toolPtr->lParam;
+    }
 
     return TRUE;
 }
 
 
-// << TOOLTIPS_HitTest32W >>
+static LRESULT
+TOOLTIPS_HitTest32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTHITTESTINFO32W lptthit = (LPTTHITTESTINFO32W)lParam;
+    TTTOOL_INFO *toolPtr;
+    INT32 nTool;
+
+    if (lptthit == 0)
+	return FALSE;
+
+    nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt);
+    if (nTool == -1)
+	return FALSE;
+
+    TRACE (tooltips, "tool %d!\n", nTool);
+
+    /* copy tool data */
+    if (lptthit->ti.cbSize >= sizeof(TTTOOLINFO32W)) {
+	toolPtr = &infoPtr->tools[nTool];
+
+	lptthit->ti.uFlags   = toolPtr->uFlags;
+	lptthit->ti.hwnd     = toolPtr->hwnd;
+	lptthit->ti.uId      = toolPtr->uId;
+	lptthit->ti.rect     = toolPtr->rect;
+	lptthit->ti.hinst    = toolPtr->hinst;
+//	lptthit->ti.lpszText = toolPtr->lpszText;
+	lptthit->ti.lpszText = NULL;  /* FIXME */
+	lptthit->ti.lParam   = toolPtr->lParam;
+    }
+
+    return TRUE;
+}
 
 
 static LRESULT
@@ -961,7 +1333,25 @@
 }
 
 
-// << TOOLTIPS_NewToolRect32W >>
+static LRESULT
+TOOLTIPS_NewToolRect32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTTOOLINFO32W lpti = (LPTTTOOLINFO32W)lParam;
+    INT32 nTool;
+
+    if (lpti == NULL)
+	return 0;
+    if (lpti->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return FALSE;
+
+    nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpti);
+    if (nTool == -1) return 0;
+
+    infoPtr->tools[nTool].rect = lpti->rect;
+
+    return 0;
+}
 
 
 __inline__ static LRESULT
@@ -1153,16 +1543,21 @@
 
     if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)) {
 	TRACE (tooltips, "set string id %x!\n", (INT32)lpToolInfo->lpszText);
-	toolPtr->lpszText = lpToolInfo->lpszText;
+	toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
     }
     else if (lpToolInfo->lpszText) {
 	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A)
-	    toolPtr->lpszText = lpToolInfo->lpszText;
+	    toolPtr->lpszText = LPSTR_TEXTCALLBACK32W;
 	else {
-	    INT32 len = lstrlen32A (lpToolInfo->lpszText);
-	    COMCTL32_Free (toolPtr->lpszText);
-	    toolPtr->lpszText =	COMCTL32_Alloc (len + 1);
-	    lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
+	    if (toolPtr->lpszText) {
+		COMCTL32_Free (toolPtr->lpszText);
+		toolPtr->lpszText = NULL;
+	    }
+	    if (lpToolInfo->lpszText) {
+		INT32 len = lstrlen32A (lpToolInfo->lpszText);
+		toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+		lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText);
+	    }
 	}
     }
 
@@ -1173,7 +1568,58 @@
 }
 
 
-// << TOOLTIPS_SetToolInfo32W >>
+static LRESULT
+TOOLTIPS_SetToolInfo32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTTOOLINFO32W lpToolInfo = (LPTTTOOLINFO32W)lParam;
+    TTTOOL_INFO *toolPtr;
+    INT32 nTool;
+
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return 0;
+
+    nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
+    if (nTool == -1) return 0;
+
+    TRACE (tooltips, "tool %d\n", nTool);
+
+    toolPtr = &infoPtr->tools[nTool];
+
+    /* copy tool data */
+    toolPtr->uFlags = lpToolInfo->uFlags;
+    toolPtr->hwnd   = lpToolInfo->hwnd;
+    toolPtr->uId    = lpToolInfo->uId;
+    toolPtr->rect   = lpToolInfo->rect;
+    toolPtr->hinst  = lpToolInfo->hinst;
+
+    if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)) {
+	TRACE (tooltips, "set string id %x!\n", (INT32)lpToolInfo->lpszText);
+	toolPtr->lpszText = lpToolInfo->lpszText;
+    }
+    else if (lpToolInfo->lpszText) {
+	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32W)
+	    toolPtr->lpszText = LPSTR_TEXTCALLBACK32W;
+	else {
+	    if (toolPtr->lpszText) {
+		COMCTL32_Free (toolPtr->lpszText);
+		toolPtr->lpszText = NULL;
+	    }
+	    if (lpToolInfo->lpszText) {
+		INT32 len = lstrlen32W (lpToolInfo->lpszText);
+		toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+		lstrcpy32W (toolPtr->lpszText, lpToolInfo->lpszText);
+	    }
+	}
+    }
+
+    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32W))
+	toolPtr->lParam = lpToolInfo->lParam;
+
+    return 0;
+}
 
 
 static LRESULT
@@ -1265,16 +1711,21 @@
     toolPtr->hinst  = lpToolInfo->hinst;
 
     if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)){
-	toolPtr->lpszText = lpToolInfo->lpszText;
+	toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
     }
     else if (lpToolInfo->lpszText) {
 	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A)
-	    toolPtr->lpszText = lpToolInfo->lpszText;
+	    toolPtr->lpszText = LPSTR_TEXTCALLBACK32W;
 	else {
-	    INT32 len = lstrlen32A (lpToolInfo->lpszText);
-	    COMCTL32_Free (toolPtr->lpszText);
-	    toolPtr->lpszText =	COMCTL32_Alloc (len + 1);
-	    lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
+	    if (toolPtr->lpszText) {
+		COMCTL32_Free (toolPtr->lpszText);
+		toolPtr->lpszText = NULL;
+	    }
+	    if (lpToolInfo->lpszText) {
+		INT32 len = lstrlen32A (lpToolInfo->lpszText);
+		toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+		lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText);
+	    }
 	}
     }
 
@@ -1282,7 +1733,51 @@
 }
 
 
-// << TOOLTIPS_UpdateTipText32W >>
+static LRESULT
+TOOLTIPS_UpdateTipText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTTTOOLINFO32W lpToolInfo = (LPTTTOOLINFO32W)lParam;
+    TTTOOL_INFO *toolPtr;
+    INT32 nTool;
+
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32W)
+	return FALSE;
+
+    nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
+    if (nTool == -1)
+	return 0;
+
+    TRACE (tooltips, "tool %d\n", nTool);
+
+    toolPtr = &infoPtr->tools[nTool];
+
+    /* copy tool text */
+    toolPtr->hinst  = lpToolInfo->hinst;
+
+    if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)){
+	toolPtr->lpszText = lpToolInfo->lpszText;
+    }
+    else if (lpToolInfo->lpszText) {
+	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32W)
+	    toolPtr->lpszText = LPSTR_TEXTCALLBACK32W;
+	else {
+	    if (toolPtr->lpszText) {
+		COMCTL32_Free (toolPtr->lpszText);
+		toolPtr->lpszText = NULL;
+	    }
+	    if (lpToolInfo->lpszText) {
+		INT32 len = lstrlen32W (lpToolInfo->lpszText);
+		toolPtr->lpszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+		lstrcpy32W (toolPtr->lpszText, lpToolInfo->lpszText);
+	    }
+	}
+    }
+
+    return 0;
+}
 
 
 static LRESULT
@@ -1298,6 +1793,7 @@
 {
     TOOLTIPS_INFO *infoPtr;
     NONCLIENTMETRICS32A nclm;
+    INT32 nResult;
 
     /* allocate memory for info structure */
     infoPtr = (TOOLTIPS_INFO *)COMCTL32_Alloc (sizeof(TOOLTIPS_INFO));
@@ -1329,6 +1825,16 @@
     infoPtr->nAutoPopTime   = 5000;
     infoPtr->nInitialTime   = 500;
 
+    nResult =
+	(INT32) SendMessage32A (wndPtr->parent->hwndSelf, WM_NOTIFYFORMAT,
+				(WPARAM32)wndPtr->hwndSelf, (LPARAM)NF_QUERY);
+    if (nResult == NFR_ANSI)
+	FIXME (tooltips, " -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
+    else if (nResult == NFR_UNICODE)
+	FIXME (tooltips, " -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
+    else
+	FIXME (tooltips, " -- WM_NOTIFYFORMAT returns: error!\n");
+
     SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, 0, 0, 0, 0,
 		    SWP_NOZORDER | SWP_HIDEWINDOW);
 
@@ -1348,7 +1854,7 @@
 	for (i = 0; i < infoPtr->uNumTools; i++) {
 	    toolPtr = &infoPtr->tools[i];
 	    if ((toolPtr->hinst) && (toolPtr->lpszText)) {
-		if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32A)
+		if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32W)
 		    COMCTL32_Free (toolPtr->lpszText);
 	    }
 
@@ -1357,14 +1863,14 @@
 		LPTT_SUBCLASS_INFO lpttsi;
 
 		if (toolPtr->uFlags & TTF_IDISHWND)
-		    lpttsi = (LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
+		    lpttsi = (LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
 		else
-		    lpttsi = (LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
+		    lpttsi = (LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, COMCTL32_aSubclass);
 
 		if (lpttsi) {
 		    SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
 				      (LONG)lpttsi->wpOrigProc);
-		    RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
+		    RemoveProp32A ((HWND32)toolPtr->uId, COMCTL32_aSubclass);
 		    COMCTL32_Free (&lpttsi);
 		}
 	    }
@@ -1530,7 +2036,7 @@
 TOOLTIPS_SubclassProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
 {
     LPTT_SUBCLASS_INFO lpttsi =
-	(LPTT_SUBCLASS_INFO)GetProp32A (hwnd, TT_SUBCLASS_PROP);
+	(LPTT_SUBCLASS_INFO)GetProp32A (hwnd, COMCTL32_aSubclass);
     WND *wndPtr;
     TOOLTIPS_INFO *infoPtr;
     UINT32 nTool;
@@ -1603,22 +2109,26 @@
 	case TTM_ADDTOOL32A:
 	    return TOOLTIPS_AddTool32A (wndPtr, wParam, lParam);
 
-//	case TTM_ADDTOOL32W:
+	case TTM_ADDTOOL32W:
+	    return TOOLTIPS_AddTool32W (wndPtr, wParam, lParam);
 
 	case TTM_DELTOOL32A:
 	    return TOOLTIPS_DelTool32A (wndPtr, wParam, lParam);
 
-//	case TTM_DELTOOL32W:
+	case TTM_DELTOOL32W:
+	    return TOOLTIPS_DelTool32W (wndPtr, wParam, lParam);
 
 	case TTM_ENUMTOOLS32A:
 	    return TOOLTIPS_EnumTools32A (wndPtr, wParam, lParam);
 
-//	case TTM_ENUMTOOLS32W:
+	case TTM_ENUMTOOLS32W:
+	    return TOOLTIPS_EnumTools32W (wndPtr, wParam, lParam);
 
 	case TTM_GETCURRENTTOOL32A:
 	    return TOOLTIPS_GetCurrentTool32A (wndPtr, wParam, lParam);
 
-//	case TTM_GETCURRENTTOOL32W:
+	case TTM_GETCURRENTTOOL32W:
+	    return TOOLTIPS_GetCurrentTool32W (wndPtr, wParam, lParam);
 
 	case TTM_GETDELAYTIME:
 	    return TOOLTIPS_GetDelayTime (wndPtr, wParam, lParam);
@@ -1632,7 +2142,8 @@
 	case TTM_GETTEXT32A:
 	    return TOOLTIPS_GetText32A (wndPtr, wParam, lParam);
 
-//	case TTM_GETTEXT32W:
+	case TTM_GETTEXT32W:
+	    return TOOLTIPS_GetText32W (wndPtr, wParam, lParam);
 
 	case TTM_GETTIPBKCOLOR:
 	    return TOOLTIPS_GetTipBkColor (wndPtr, wParam, lParam);
@@ -1646,17 +2157,20 @@
 	case TTM_GETTOOLINFO32A:
 	    return TOOLTIPS_GetToolInfo32A (wndPtr, wParam, lParam);
 
-//	case TTM_GETTOOLINFO32W:
+	case TTM_GETTOOLINFO32W:
+	    return TOOLTIPS_GetToolInfo32W (wndPtr, wParam, lParam);
 
 	case TTM_HITTEST32A:
 	    return TOOLTIPS_HitTest32A (wndPtr, wParam, lParam);
 
-//	case TTM_HITTEST32W:
+	case TTM_HITTEST32W:
+	    return TOOLTIPS_HitTest32W (wndPtr, wParam, lParam);
 
 	case TTM_NEWTOOLRECT32A:
 	    return TOOLTIPS_NewToolRect32A (wndPtr, wParam, lParam);
 
-//	case TTM_NEWTOOLRECT32W:
+	case TTM_NEWTOOLRECT32W:
+	    return TOOLTIPS_NewToolRect32W (wndPtr, wParam, lParam);
 
 	case TTM_POP:
 	    return TOOLTIPS_Pop (wndPtr, wParam, lParam);
@@ -1682,7 +2196,8 @@
 	case TTM_SETTOOLINFO32A:
 	    return TOOLTIPS_SetToolInfo32A (wndPtr, wParam, lParam);
 
-//	case TTM_SETTOOLINFO32W:
+	case TTM_SETTOOLINFO32W:
+	    return TOOLTIPS_SetToolInfo32W (wndPtr, wParam, lParam);
 
 	case TTM_TRACKACTIVATE:
 	    return TOOLTIPS_TrackActivate (wndPtr, wParam, lParam);
@@ -1696,7 +2211,8 @@
 	case TTM_UPDATETIPTEXT32A:
 	    return TOOLTIPS_UpdateTipText32A (wndPtr, wParam, lParam);
 
-//	case TTM_UPDATETIPTEXT32W:
+	case TTM_UPDATETIPTEXT32W:
+	    return TOOLTIPS_UpdateTipText32W (wndPtr, wParam, lParam);
 
 	case TTM_WINDOWFROMPOINT:
 	    return TOOLTIPS_WindowFromPoint (wndPtr, wParam, lParam);
@@ -1729,6 +2245,9 @@
 	case WM_NCHITTEST:
 	    return TOOLTIPS_NCHitTest (wndPtr, wParam, lParam);
 
+//	case WM_NOTIFYFORMAT:
+//	    return TOOLTIPS_NotifyFormat (wndPtr, wParam, lParam);
+
 	case WM_PAINT:
 	    return TOOLTIPS_Paint (wndPtr, wParam, lParam);