1. I have moved CLSIDFromProgID out of ole16.c and in to Storage32.c as it is called from there. Will a Ole32 guru please suggest a better fix as Windows does not export CLSIDFromProgID16. I think importing this here is wrong.
2. IsAccelerator is borked. This patch does not rewrite it. It currently still calls LockResource16. Once again this will need to be fixed here and in controls/menu.c at some point I guess. For me its not a big deal as I can #ifdef around it in the ReactOS sources.
After this patch the only non-win32 api call left in Ole32 is to LockResource16.
Thanks Steven
Changelog: Win16/32 separation of Ole32
--- /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 20 May 2003 13:00:37 -0000 @@ -47,7 +47,10 @@ C_SRCS16 = \ memlockbytes16.c \ - ole2nls.c + ole16.c \ + ole2_16.c \ + ole2nls.c \ + storage.c RC_SRCS = ole32res.rc version.rc