Ole32 patch again

Steven Edwards Steven_Ed4153 at yahoo.com
Tue May 20 19:31:31 CDT 2003


Changelog: Split more Win16/32 support in Ole32

Sorry about that. I sent the wrong Makefile.in. Sometimes I get in to a 
rush with my day job and cant get my laptop and desktop changes quite in 
sync. Anyway here it is again with the right patch this time.

Before this patch Ole32 imports these functions that dont exist on Win2K 
or NT.
GDI32 - CloseMetaFile16
Kernel32 - FreeLibrary16
GetCurrentTask
GetModuleHandle16
GetProcAddress16
GlobalAlloc16
GlobalLock16
K32WOWCallback16Ex
K32WOWGlobalAllocLock16
K32WOWGlobalUnlockFree16
LoadLibrary16
LockResource16
MapLS
UnMapLS

Afterword we are down to this -
Kernel32 - LockResource16 called from IsAccelerator


-------------- next part --------------
--- /dev/null	Tue May 20 08:59:31 2003
+++ ole2_16.c	Sun May 18 18:30:34 2003
@@ -0,0 +1,233 @@
+
+/*
+ *	OLE2 library - 16 bit Interfaces
+ *
+ *	Copyright 1995	Martin von Loewis
+ *      Copyright 1999  Francis Beaudet
+ *      Copyright 1999  Noel Borthwick
+ *
+ * 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 "config.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "commctrl.h"
+#include "ole2.h"
+#include "ole2ver.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winerror.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "wownt32.h"
+
+#include "wine/winbase16.h"
+#include "wine/wingdi16.h"
+#include "wine/winuser16.h"
+#include "ole32_main.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(ole);
+WINE_DECLARE_DEBUG_CHANNEL(accel);
+
+#define HICON_16(h32)		(LOWORD(h32))
+#define HICON_32(h16)		((HICON)(ULONG_PTR)(h16))
+#define HINSTANCE_32(h16)	((HINSTANCE)(ULONG_PTR)(h16))
+
+/******************************************************************************
+ * These are static/global variables and internal data structures that the
+ * OLE module uses to maintain it's state.
+ */
+typedef struct tagDropTargetNode
+{
+  HWND          hwndTarget;
+  IDropTarget*    dropTarget;
+  struct tagDropTargetNode* prevDropTarget;
+  struct tagDropTargetNode* nextDropTarget;
+} DropTargetNode;
+
+typedef struct tagTrackerWindowInfo
+{
+  IDataObject* dataObject;
+  IDropSource* dropSource;
+  DWORD        dwOKEffect;
+  DWORD*       pdwEffect;
+  BOOL       trackingDone;
+  HRESULT      returnValue;
+
+  BOOL       escPressed;
+  HWND       curTargetHWND;	/* window the mouse is hovering over */
+  HWND       curDragTargetHWND; /* might be a ancestor of curTargetHWND */
+  IDropTarget* curDragTarget;
+} TrackerWindowInfo;
+
+typedef struct tagOleMenuDescriptor  /* OleMenuDescriptor */
+{
+  HWND               hwndFrame;         /* The containers frame window */
+  HWND               hwndActiveObject;  /* The active objects window */
+  OLEMENUGROUPWIDTHS mgw;               /* OLE menu group widths for the shared menu */
+  HMENU              hmenuCombined;     /* The combined menu */
+  BOOL               bIsServerItem;     /* True if the currently open popup belongs to the server */
+} OleMenuDescriptor;
+
+typedef struct tagOleMenuHookItem   /* OleMenu hook item in per thread hook list */
+{
+  DWORD tid;                /* Thread Id  */
+  HANDLE hHeap;             /* Heap this is allocated from */
+  HHOOK GetMsg_hHook;       /* message hook for WH_GETMESSAGE */
+  HHOOK CallWndProc_hHook;  /* message hook for WH_CALLWNDPROC */
+  struct tagOleMenuHookItem *next;
+} OleMenuHookItem;
+
+/*
+ * Name of our registered window class.
+ */
+static const char OLEDD_DRAGTRACKERCLASS[] = "WineDragDropTracker32";
+
+/******************************************************************************
+ * These are the prototypes of the utility methods used to manage a shared menu
+ */
+BOOL OLEMenu_InstallHooks( DWORD tid );
+BOOL OLEMenu_UnInstallHooks( DWORD tid );
+OleMenuHookItem * OLEMenu_IsHookInstalled( DWORD tid );
+static BOOL OLEMenu_FindMainMenuIndex( HMENU hMainMenu, HMENU hPopupMenu, UINT *pnPos );
+BOOL OLEMenu_SetIsServerMenu( HMENU hmenu, OleMenuDescriptor *pOleMenuDescriptor );
+LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lParam);
+LRESULT CALLBACK OLEMenu_GetMsgProc(INT code, WPARAM wParam, LPARAM lParam);
+
+/******************************************************************************
+ * These are the prototypes of the OLE Clipboard initialization methods (in clipboard.c)
+ */
+void OLEClipbrd_UnInitialize();
+void OLEClipbrd_Initialize();
+
+/***********************************************************************
+ *           RegisterDragDrop (OLE2.35)
+ */
+HRESULT WINAPI RegisterDragDrop16(
+	HWND16 hwnd,
+	LPDROPTARGET pDropTarget
+) {
+	FIXME("(0x%04x,%p),stub!\n",hwnd,pDropTarget);
+	return S_OK;
+}
+
+/***********************************************************************
+ *           RevokeDragDrop (OLE2.36)
+ */
+HRESULT WINAPI RevokeDragDrop16(
+	HWND16 hwnd
+) {
+	FIXME("(0x%04x),stub!\n",hwnd);
+	return S_OK;
+}
+
+/**************************************************************************
+ * Internal methods to manage the shared OLE menu in response to the
+ * OLE***MenuDescriptor API
+ */
+
+/***********************************************************************
+ *           OLEMenu_FindMainMenuIndex
+ *
+ * Used by OLEMenu API to find the top level group a menu item belongs to.
+ * On success pnPos contains the index of the item in the top level menu group
+ *
+ * RETURNS: TRUE if the ID was found, FALSE on failure
+ */
+static BOOL OLEMenu_FindMainMenuIndex( HMENU hMainMenu, HMENU hPopupMenu, UINT *pnPos )
+{
+  UINT i, nItems;
+
+  nItems = GetMenuItemCount( hMainMenu );
+
+  for (i = 0; i < nItems; i++)
+  {
+    HMENU hsubmenu;
+
+    /*  Is the current item a submenu? */
+    if ( (hsubmenu = GetSubMenu(hMainMenu, i)) )
+    {
+      /* If the handle is the same we're done */
+      if ( hsubmenu == hPopupMenu )
+      {
+        if (pnPos)
+          *pnPos = i;
+        return TRUE;
+      }
+      /* Recursively search without updating pnPos */
+      else if ( OLEMenu_FindMainMenuIndex( hsubmenu, hPopupMenu, NULL ) )
+      {
+        if (pnPos)
+          *pnPos = i;
+        return TRUE;
+      }
+    }
+  }
+
+  return FALSE;
+}
+
+/******************************************************************************
+ * OleMetaFilePictFromIconAndLabel (OLE2.56)
+ *
+ * Returns a global memory handle to a metafile which contains the icon and
+ * label given.
+ * I guess the result of that should look somehow like desktop icons.
+ * If no hIcon is given, we load the icon via lpszSourceFile and iIconIndex.
+ * This code might be wrong at some places.
+ */
+HGLOBAL16 WINAPI OleMetaFilePictFromIconAndLabel16(
+	HICON16 hIcon,
+	LPCOLESTR16 lpszLabel,
+	LPCOLESTR16 lpszSourceFile,
+	UINT16 iIconIndex
+) {
+    METAFILEPICT16 *mf;
+    HGLOBAL16 hmf;
+    HDC hdc;
+
+    FIXME("(%04x, '%s', '%s', %d): incorrect metrics, please try to correct them !\n\n\n", hIcon, lpszLabel, lpszSourceFile, iIconIndex);
+
+    if (!hIcon) {
+        if (lpszSourceFile) {
+	    HINSTANCE16 hInstance = LoadLibrary16(lpszSourceFile);
+
+	    /* load the icon at index from lpszSourceFile */
+	    hIcon = HICON_16(LoadIconA(HINSTANCE_32(hInstance), (LPCSTR)(DWORD)iIconIndex));
+	    FreeLibrary16(hInstance);
+	} else
+	    return 0;
+    }
+
+    hdc = CreateMetaFileA(NULL);
+    DrawIcon(hdc, 0, 0, HICON_32(hIcon)); /* FIXME */
+    TextOutA(hdc, 0, 0, lpszLabel, 1); /* FIXME */
+    hmf = GlobalAlloc16(0, sizeof(METAFILEPICT16));
+    mf = (METAFILEPICT16 *)GlobalLock16(hmf);
+    mf->mm = MM_ANISOTROPIC;
+    mf->xExt = 20; /* FIXME: bogus */
+    mf->yExt = 20; /* dito */
+    mf->hMF = CloseMetaFile16(HDC_16(hdc));
+    return hmf;
+}

Index: ole2.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/ole2.c,v
retrieving revision 1.42
diff -u -r1.42 ole2.c
--- ole2.c	28 Jan 2003 01:06:20 -0000	1.42
+++ ole2.c	20 May 2003 12:58:43 -0000
@@ -1,6 +1,6 @@
 
 /*
- *	OLE2 library
+ *	OLE2 library - 32 bit Interfaces
  *
  *	Copyright 1995	Martin von Loewis
  *      Copyright 1999  Francis Beaudet
@@ -319,17 +319,6 @@
 }
 
 /***********************************************************************
- *           RegisterDragDrop (OLE2.35)
- */
-HRESULT WINAPI RegisterDragDrop16(
-	HWND16 hwnd,
-	LPDROPTARGET pDropTarget
-) {
-	FIXME("(0x%04x,%p),stub!\n",hwnd,pDropTarget);
-	return S_OK;
-}
-
-/***********************************************************************
  *           RegisterDragDrop (OLE32.139)
  */
 HRESULT WINAPI RegisterDragDrop(
@@ -373,16 +362,6 @@
 }
 
 /***********************************************************************
- *           RevokeDragDrop (OLE2.36)
- */
-HRESULT WINAPI RevokeDragDrop16(
-	HWND16 hwnd
-) {
-	FIXME("(0x%04x),stub!\n",hwnd);
-	return S_OK;
-}
-
-/***********************************************************************
  *           RevokeDragDrop (OLE32.141)
  */
 HRESULT WINAPI RevokeDragDrop(
@@ -2212,50 +2191,6 @@
 	break;
     }
   }
-}
-
-/******************************************************************************
- * OleMetaFilePictFromIconAndLabel (OLE2.56)
- *
- * Returns a global memory handle to a metafile which contains the icon and
- * label given.
- * I guess the result of that should look somehow like desktop icons.
- * If no hIcon is given, we load the icon via lpszSourceFile and iIconIndex.
- * This code might be wrong at some places.
- */
-HGLOBAL16 WINAPI OleMetaFilePictFromIconAndLabel16(
-	HICON16 hIcon,
-	LPCOLESTR16 lpszLabel,
-	LPCOLESTR16 lpszSourceFile,
-	UINT16 iIconIndex
-) {
-    METAFILEPICT16 *mf;
-    HGLOBAL16 hmf;
-    HDC hdc;
-
-    FIXME("(%04x, '%s', '%s', %d): incorrect metrics, please try to correct them !\n\n\n", hIcon, lpszLabel, lpszSourceFile, iIconIndex);
-
-    if (!hIcon) {
-        if (lpszSourceFile) {
-	    HINSTANCE16 hInstance = LoadLibrary16(lpszSourceFile);
-
-	    /* load the icon at index from lpszSourceFile */
-	    hIcon = HICON_16(LoadIconA(HINSTANCE_32(hInstance), (LPCSTR)(DWORD)iIconIndex));
-	    FreeLibrary16(hInstance);
-	} else
-	    return 0;
-    }
-
-    hdc = CreateMetaFileA(NULL);
-    DrawIcon(hdc, 0, 0, HICON_32(hIcon)); /* FIXME */
-    TextOutA(hdc, 0, 0, lpszLabel, 1); /* FIXME */
-    hmf = GlobalAlloc16(0, sizeof(METAFILEPICT16));
-    mf = (METAFILEPICT16 *)GlobalLock16(hmf);
-    mf->mm = MM_ANISOTROPIC;
-    mf->xExt = 20; /* FIXME: bogus */
-    mf->yExt = 20; /* dito */
-    mf->hMF = CloseMetaFile16(HDC_16(hdc));
-    return hmf;
 }
 
 /******************************************************************************

Index: ole16.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/ole16.c,v
retrieving revision 1.4
diff -u -r1.4 ole16.c
--- ole16.c	12 Apr 2003 00:09:14 -0000	1.4
+++ ole16.c	20 May 2003 12:59:07 -0000
@@ -384,37 +384,6 @@
   return ret;
 }
 
-/******************************************************************************
- *		CLSIDFromProgID	[COMPOBJ.61]
- * Converts a program id into the respective GUID. (By using a registry lookup)
- * RETURNS
- *	riid associated with the progid
- */
-HRESULT WINAPI CLSIDFromProgID16(
-	LPCOLESTR16 progid,	/* [in] program id as found in registry */
-	LPCLSID riid		/* [out] associated CLSID */
-) {
-	char	*buf,buf2[80];
-	DWORD	buf2len;
-	HRESULT	err;
-	HKEY	xhkey;
-
-	buf = HeapAlloc(GetProcessHeap(),0,strlen(progid)+8);
-	sprintf(buf,"%s\\CLSID",progid);
-	if ((err=RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&xhkey))) {
-		HeapFree(GetProcessHeap(),0,buf);
-                return CO_E_CLASSSTRING;
-	}
-	HeapFree(GetProcessHeap(),0,buf);
-	buf2len = sizeof(buf2);
-	if ((err=RegQueryValueA(xhkey,NULL,buf2,&buf2len))) {
-		RegCloseKey(xhkey);
-                return CO_E_CLASSSTRING;
-	}
-	RegCloseKey(xhkey);
-	return __CLSIDFromStringA(buf2,riid);
-}
-
 /***********************************************************************
  *           LookupETask (COMPOBJ.94)
  */

Index: storage32.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/storage32.c,v
retrieving revision 1.39
diff -u -r1.39 storage32.c
--- storage32.c	13 May 2003 00:41:58 -0000	1.39
+++ storage32.c	20 May 2003 12:59:36 -0000
@@ -6823,6 +6823,36 @@
     return r;
 }
 
+/******************************************************************************
+ *		CLSIDFromProgID	[COMPOBJ.61] [Internal]
+ * Converts a program id into the respective GUID. (By using a registry lookup)
+ * RETURNS
+ *	riid associated with the progid
+ */
+HRESULT WINAPI CLSIDFromProgID16(
+	LPCOLESTR16 progid,	/* [in] program id as found in registry */
+	LPCLSID riid		/* [out] associated CLSID */
+) {
+	char	*buf,buf2[80];
+	DWORD	buf2len;
+	HRESULT	err;
+	HKEY	xhkey;
+
+	buf = HeapAlloc(GetProcessHeap(),0,strlen(progid)+8);
+	sprintf(buf,"%s\\CLSID",progid);
+	if ((err=RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&xhkey))) {
+		HeapFree(GetProcessHeap(),0,buf);
+                return CO_E_CLASSSTRING;
+	}
+	HeapFree(GetProcessHeap(),0,buf);
+	buf2len = sizeof(buf2);
+	if ((err=RegQueryValueA(xhkey,NULL,buf2,&buf2len))) {
+		RegCloseKey(xhkey);
+                return CO_E_CLASSSTRING;
+	}
+	RegCloseKey(xhkey);
+	return __CLSIDFromStringA(buf2,riid);
+}
 
 /*************************************************************************
  * OLECONVERT_CreateCompObjStream [Internal]


Index: Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/ole32/Makefile.in,v
retrieving revision 1.30
diff -u -r1.30 Makefile.in
--- Makefile.in	15 May 2003 22:55:37 -0000	1.30
+++ Makefile.in	21 May 2003 00:27:03 -0000
@@ -31,7 +31,6 @@
 	marshal.c \
 	memlockbytes.c \
 	moniker.c \
-	ole16.c \
 	ole2.c \
 	ole2stubs.c \
 	ole2impl.c \
@@ -42,12 +41,14 @@
 	rpc.c \
 	stg_bigblockfile.c \
 	stg_stream.c \
-	storage.c \
 	storage32.c
 
 C_SRCS16 = \
 	memlockbytes16.c \
-	ole2nls.c
+	ole16.c \
+	ole2_16.c \
+	ole2nls.c \
+	storage.c
 
 RC_SRCS = ole32res.rc version.rc
 


More information about the wine-patches mailing list