Commit 77b7f957 authored by Robert Shearman's avatar Robert Shearman Committed by Alexandre Julliard

Make ole32 a delay-load import of shell32.

parent 2ed053b5
......@@ -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
IMPORTS = shlwapi comctl32 user32 gdi32 advapi32 kernel32
DELAYIMPORTS = ole32
ALTNAMES = shell.dll
EXTRALIBS = -luuid $(LIBUNICODE)
......
......@@ -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
*
......
......@@ -131,20 +131,6 @@ HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uI
/* Systray */
BOOL SYSTRAY_Init(void);
/* 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);
......
......@@ -73,30 +73,6 @@ struct {
};
/*************************************************************************
* __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]
*
* NOTES
......@@ -212,7 +188,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;
}
......@@ -438,17 +414,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) {
......
......@@ -424,8 +424,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);
}
/*************************************************************************
......@@ -437,8 +436,7 @@ HRESULT WINAPI SHRegisterDragDrop(
HRESULT WINAPI SHRevokeDragDrop(HWND hWnd)
{
FIXME("(%p):stub.\n",hWnd);
if (GetShellOle()) return pRevokeDragDrop(hWnd);
return 0;
return RevokeDragDrop(hWnd);
}
/*************************************************************************
......@@ -456,8 +454,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);
}
/*************************************************************************
......
......@@ -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 */
......@@ -1231,10 +1228,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)))
......@@ -1248,10 +1243,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;
......@@ -1456,10 +1450,8 @@ 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;
......
......@@ -223,7 +223,7 @@ static BOOL DoPaste(
TRACE("\n");
if(SUCCEEDED(pOleGetClipboard(&pda)))
if(SUCCEEDED(OleGetClipboard(&pda)))
{
STGMEDIUM medium;
FORMATETC formatetc;
......@@ -277,7 +277,7 @@ static BOOL DoPaste(
SHFree(pidl);
/* release the medium*/
pReleaseStgMedium(&medium);
ReleaseStgMedium(&medium);
}
IDataObject_Release(pda);
}
......
......@@ -362,62 +362,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()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment