From 0cffba8389fa2dee47c4ed137f8b659ced21a269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 22:03:09 +0000 Subject: [PATCH] Robert Shearman - Make ole32 a delay-load import of shell32. (except that the ReactOS build system doesn't handle delay-load imports yet, so make it a normal import) svn path=/trunk/; revision=10100 --- reactos/lib/shell32/Makefile.in | 4 +- reactos/lib/shell32/Makefile.ros-template | 4 +- reactos/lib/shell32/clipboard.c | 37 --------------- reactos/lib/shell32/shell32_main.h | 14 ------ reactos/lib/shell32/shellole.c | 39 ++++------------ reactos/lib/shell32/shellord.c | 9 ++-- reactos/lib/shell32/shlview.c | 21 +++------ reactos/lib/shell32/shv_item_cmenu.c | 56 +++-------------------- 8 files changed, 29 insertions(+), 155 deletions(-) diff --git a/reactos/lib/shell32/Makefile.in b/reactos/lib/shell32/Makefile.in index 7f2fe6052c1..01b637d52b1 100644 --- a/reactos/lib/shell32/Makefile.in +++ b/reactos/lib/shell32/Makefile.in @@ -4,8 +4,8 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = shell32.dll -# fixme: avoid ole32.dll import -IMPORTS = ole32 shlwapi comctl32 user32 gdi32 advapi32 kernel32 ntdll +IMPORTS = shlwapi comctl32 user32 gdi32 advapi32 kernel32 +DELAYIMPORTS = ole32 ALTNAMES = shell.dll EXTRALIBS = $(LIBUUID) $(LIBUNICODE) diff --git a/reactos/lib/shell32/Makefile.ros-template b/reactos/lib/shell32/Makefile.ros-template index 4f5efabbd62..7346ce5b19c 100644 --- a/reactos/lib/shell32/Makefile.ros-template +++ b/reactos/lib/shell32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:46 hbirr Exp $ +# $Id: Makefile.ros-template,v 1.4 2004/07/12 22:03:09 gvg Exp $ TARGET_NAME = shell32 @@ -6,7 +6,7 @@ TARGET_OBJECTS = @C_SRCS@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -TARGET_SDKLIBS = libwine.a @IMPORTS@ wine_uuid.a +TARGET_SDKLIBS = libwine.a @IMPORTS@ ole32.a wine_uuid.a ntdll.a TARGET_BASE = $(TARGET_BASE_LIB_SHELL32) diff --git a/reactos/lib/shell32/clipboard.c b/reactos/lib/shell32/clipboard.c index ad1e0bf226a..71c929365b9 100644 --- a/reactos/lib/shell32/clipboard.c +++ b/reactos/lib/shell32/clipboard.c @@ -52,43 +52,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); -HRESULT (WINAPI *pOleInitialize)(LPVOID reserved); -void (WINAPI *pOleUninitialize)(void); -HRESULT (WINAPI *pRegisterDragDrop)(HWND hwnd, IDropTarget* pDropTarget); -HRESULT (WINAPI *pRevokeDragDrop)(HWND hwnd); -HRESULT (WINAPI *pDoDragDrop)(LPDATAOBJECT,LPDROPSOURCE,DWORD,DWORD*); -void (WINAPI *pReleaseStgMedium)(STGMEDIUM* pmedium); -HRESULT (WINAPI *pOleSetClipboard)(IDataObject* pDataObj); -HRESULT (WINAPI *pOleGetClipboard)(IDataObject** ppDataObj); - -/************************************************************************** - * GetShellOle - * - * make sure OLE32.DLL is loaded - */ -BOOL GetShellOle(void) -{ - static HANDLE hOle32 = NULL; - if(!hOle32) - { - hOle32 = LoadLibraryA("ole32.dll"); - if(hOle32) - { - pOleInitialize=(void*)GetProcAddress(hOle32,"OleInitialize"); - pOleUninitialize=(void*)GetProcAddress(hOle32,"OleUninitialize"); - pRegisterDragDrop=(void*)GetProcAddress(hOle32,"RegisterDragDrop"); - pRevokeDragDrop=(void*)GetProcAddress(hOle32,"RevokeDragDrop"); - pDoDragDrop=(void*)GetProcAddress(hOle32,"DoDragDrop"); - pReleaseStgMedium=(void*)GetProcAddress(hOle32,"ReleaseStgMedium"); - pOleSetClipboard=(void*)GetProcAddress(hOle32,"OleSetClipboard"); - pOleGetClipboard=(void*)GetProcAddress(hOle32,"OleGetClipboard"); - - pOleInitialize(NULL); - } - } - return TRUE; -} - /************************************************************************** * RenderHDROP * diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index 6ecdabe776c..7787fb4a121 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -130,20 +130,6 @@ HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uI BOOL SYSTRAY_Init(void); #endif -/* OLE32 */ -extern HINSTANCE hShellOle32; - -extern HRESULT (WINAPI *pOleInitialize)(LPVOID reserved); -extern void (WINAPI *pOleUninitialize)(void); -extern HRESULT (WINAPI *pRegisterDragDrop)(HWND hwnd, IDropTarget* pDropTarget); -extern HRESULT (WINAPI *pRevokeDragDrop)(HWND hwnd); -extern HRESULT (WINAPI *pDoDragDrop)(LPDATAOBJECT,LPDROPSOURCE,DWORD,DWORD*); -extern void (WINAPI *pReleaseStgMedium)(STGMEDIUM* pmedium); -extern HRESULT (WINAPI *pOleSetClipboard)(IDataObject* pDataObj); -extern HRESULT (WINAPI *pOleGetClipboard)(IDataObject** ppDataObj); -extern HRESULT (WINAPI *pCoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv); - -BOOL GetShellOle(void); HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); diff --git a/reactos/lib/shell32/shellole.c b/reactos/lib/shell32/shellole.c index ccced91b89a..56acf78e81e 100644 --- a/reactos/lib/shell32/shellole.c +++ b/reactos/lib/shell32/shellole.c @@ -71,30 +71,6 @@ struct { {NULL,NULL} }; -/************************************************************************* - * __CoCreateInstance [internal] - * - * NOTES - * wraper for late bound call to OLE32.DLL - * - */ -HRESULT (WINAPI *pCoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv) = NULL; - -void * __GetExternalFunc(HMODULE * phModule, LPCWSTR szModuleName, LPCSTR szProcName) -{ - if (!*phModule) *phModule = GetModuleHandleW(szModuleName); - if (!*phModule) *phModule = LoadLibraryW(szModuleName); - if (*phModule) return GetProcAddress(*phModule, szProcName); - return NULL; -} - -HRESULT __CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv) -{ - if(!pCoCreateInstance) pCoCreateInstance = __GetExternalFunc(&hShellOle32, sOLE32, "CoCreateInstance"); - if(!pCoCreateInstance) return E_FAIL; - return pCoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, ppv); -} - /************************************************************************* * SHCoCreateInstance [SHELL32.102] * @@ -211,7 +187,7 @@ LRESULT WINAPI SHCoCreateInstance( } else { /* load a external dll in the usual way */ - hres = __CoCreateInstance(myclsid, pUnkOuter, CLSCTX_INPROC_SERVER, refiid, ppv); + hres = CoCreateInstance(myclsid, pUnkOuter, CLSCTX_INPROC_SERVER, refiid, ppv); goto end; } @@ -437,17 +413,18 @@ static ICOM_VTABLE(IMalloc) VT_Shell_IMalloc32 = */ HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal) { - HRESULT (WINAPI *pCoGetMalloc)(DWORD,LPMALLOC *); - HMODULE hOle32; - TRACE("(%p)\n", lpmal); if (!ShellTaskAllocator) { - hOle32 = GetModuleHandleA("OLE32.DLL"); + HMODULE hOle32 = GetModuleHandleA("OLE32.DLL"); + /* this is very suspect. we should not being using a different + * allocator from deallocator based on something undeterministic + * like whether ole32 is loaded. as it happens currently, they + * both map to the same allocator deep down, but this could + * change in the future. */ if(hOle32) { - pCoGetMalloc = (void*) GetProcAddress(hOle32, "CoGetMalloc"); - if (pCoGetMalloc) pCoGetMalloc(MEMCTX_TASK, &ShellTaskAllocator); + CoGetMalloc(MEMCTX_TASK, &ShellTaskAllocator); TRACE("got ole32 IMalloc\n"); } if(!ShellTaskAllocator) { diff --git a/reactos/lib/shell32/shellord.c b/reactos/lib/shell32/shellord.c index d6521fa4b75..c16b66255d2 100644 --- a/reactos/lib/shell32/shellord.c +++ b/reactos/lib/shell32/shellord.c @@ -426,8 +426,7 @@ HRESULT WINAPI SHRegisterDragDrop( LPDROPTARGET pDropTarget) { FIXME("(%p,%p):stub.\n", hWnd, pDropTarget); - if (GetShellOle()) return pRegisterDragDrop(hWnd, pDropTarget); - return 0; + return RegisterDragDrop(hWnd, pDropTarget); } /************************************************************************* @@ -439,8 +438,7 @@ HRESULT WINAPI SHRegisterDragDrop( HRESULT WINAPI SHRevokeDragDrop(HWND hWnd) { FIXME("(%p):stub.\n",hWnd); - if (GetShellOle()) return pRevokeDragDrop(hWnd); - return 0; + return RevokeDragDrop(hWnd); } /************************************************************************* @@ -458,8 +456,7 @@ HRESULT WINAPI SHDoDragDrop( { FIXME("(%p %p %p 0x%08lx %p):stub.\n", hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect); - if (GetShellOle()) return pDoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect); - return 0; + return DoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect); } /************************************************************************* diff --git a/reactos/lib/shell32/shlview.c b/reactos/lib/shell32/shlview.c index adae9a68c6b..ec0ebb2017c 100644 --- a/reactos/lib/shell32/shlview.c +++ b/reactos/lib/shell32/shlview.c @@ -656,13 +656,10 @@ static LRESULT ShellView_OnCreate(IShellViewImpl * This) } } - if(GetShellOle() && pRegisterDragDrop) + if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt))) { - if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt))) - { - pRegisterDragDrop(This->hWnd, pdt); + RegisterDragDrop(This->hWnd, pdt); IDropTarget_Release(pdt); - } } /* register for receiving notifications */ @@ -1343,10 +1340,8 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn DWORD dwAttributes = SFGAO_CANLINK; DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE; - if(GetShellOle() && pDoDragDrop) + if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,0,(LPVOID *)&pda))) { - if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,0,(LPVOID *)&pda))) - { IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource); /* own DropSource interface */ if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, (LPCITEMIDLIST*)This->apidl, &dwAttributes))) @@ -1360,10 +1355,9 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn if (pds) { DWORD dwEffect; - pDoDragDrop(pda, pds, dwEffect, &dwEffect); + DoDragDrop(pda, pds, dwEffect, &dwEffect); } IDataObject_Release(pda); - } } } break; @@ -1568,10 +1562,9 @@ static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wPara case WM_GETDLGCODE: return SendMessageA(pThis->hWndList,uMessage,0,0); - case WM_DESTROY: if(GetShellOle() && pRevokeDragDrop) - { - pRevokeDragDrop(pThis->hWnd); - } + + case WM_DESTROY: + RevokeDragDrop(pThis->hWnd); SHChangeNotifyDeregister(pThis->hNotify); break; diff --git a/reactos/lib/shell32/shv_item_cmenu.c b/reactos/lib/shell32/shv_item_cmenu.c index c5beee9be7a..a9c4cb6221e 100644 --- a/reactos/lib/shell32/shv_item_cmenu.c +++ b/reactos/lib/shell32/shv_item_cmenu.c @@ -366,62 +366,20 @@ static BOOL DoCopyOrCut( TRACE("(%p)->(wnd=%p,bCut=0x%08x)\n",This, hwnd, bCut); - if(GetShellOle()) + /* get the active IShellView */ + if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) { - /* get the active IShellView */ - if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) + if (SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) { - if (SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) + if (SUCCEEDED(IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&lpDo))) { - if (SUCCEEDED(IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&lpDo))) - { - pOleSetClipboard(lpDo); - IDataObject_Release(lpDo); - } - IShellView_Release(lpSV); + OleSetClipboard(lpDo); + IDataObject_Release(lpDo); } + IShellView_Release(lpSV); } } return TRUE; -#if 0 -/* - the following code does the copy operation witout ole32.dll - we might need this possibility too (js) -*/ - BOOL bSuccess = FALSE; - - TRACE("(%p)\n", iface); - - if(OpenClipboard(NULL)) - { - if(EmptyClipboard()) - { - IPersistFolder2 * ppf2; - IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2); - if (ppf2) - { - LPITEMIDLIST pidl; - IPersistFolder2_GetCurFolder(ppf2, &pidl); - if(pidl) - { - HGLOBAL hMem; - - hMem = RenderHDROP(pidl, This->apidl, This->cidl); - - if(SetClipboardData(CF_HDROP, hMem)) - { - bSuccess = TRUE; - } - SHFree(pidl); - } - IPersistFolder2_Release(ppf2); - } - - } - CloseClipboard(); - } - return bSuccess; -#endif } /************************************************************************** * ISvItemCm_fnInvokeCommand()