Make ole32 a delay-load import of shell32.
This commit is contained in:
parent
2ed053b5a0
commit
77b7f95716
|
@ -4,8 +4,8 @@ TOPOBJDIR = ../..
|
||||||
SRCDIR = @srcdir@
|
SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = shell32.dll
|
MODULE = shell32.dll
|
||||||
# fixme: avoid ole32.dll import
|
IMPORTS = shlwapi comctl32 user32 gdi32 advapi32 kernel32
|
||||||
IMPORTS = ole32 shlwapi comctl32 user32 gdi32 advapi32 kernel32
|
DELAYIMPORTS = ole32
|
||||||
ALTNAMES = shell.dll
|
ALTNAMES = shell.dll
|
||||||
EXTRALIBS = -luuid $(LIBUNICODE)
|
EXTRALIBS = -luuid $(LIBUNICODE)
|
||||||
|
|
||||||
|
|
|
@ -52,43 +52,6 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(shell);
|
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
|
* RenderHDROP
|
||||||
*
|
*
|
||||||
|
|
|
@ -131,20 +131,6 @@ HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uI
|
||||||
/* Systray */
|
/* Systray */
|
||||||
BOOL SYSTRAY_Init(void);
|
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 RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl);
|
||||||
HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl);
|
HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl);
|
||||||
|
|
|
@ -72,30 +72,6 @@ struct {
|
||||||
{NULL,NULL}
|
{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]
|
* SHCoCreateInstance [SHELL32.102]
|
||||||
*
|
*
|
||||||
|
@ -212,7 +188,7 @@ LRESULT WINAPI SHCoCreateInstance(
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* load a external dll in the usual way */
|
/* 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;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,17 +414,18 @@ static ICOM_VTABLE(IMalloc) VT_Shell_IMalloc32 =
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal)
|
HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal)
|
||||||
{
|
{
|
||||||
HRESULT (WINAPI *pCoGetMalloc)(DWORD,LPMALLOC *);
|
|
||||||
HMODULE hOle32;
|
|
||||||
|
|
||||||
TRACE("(%p)\n", lpmal);
|
TRACE("(%p)\n", lpmal);
|
||||||
|
|
||||||
if (!ShellTaskAllocator)
|
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) {
|
if(hOle32) {
|
||||||
pCoGetMalloc = (void*) GetProcAddress(hOle32, "CoGetMalloc");
|
CoGetMalloc(MEMCTX_TASK, &ShellTaskAllocator);
|
||||||
if (pCoGetMalloc) pCoGetMalloc(MEMCTX_TASK, &ShellTaskAllocator);
|
|
||||||
TRACE("got ole32 IMalloc\n");
|
TRACE("got ole32 IMalloc\n");
|
||||||
}
|
}
|
||||||
if(!ShellTaskAllocator) {
|
if(!ShellTaskAllocator) {
|
||||||
|
|
|
@ -424,8 +424,7 @@ HRESULT WINAPI SHRegisterDragDrop(
|
||||||
LPDROPTARGET pDropTarget)
|
LPDROPTARGET pDropTarget)
|
||||||
{
|
{
|
||||||
FIXME("(%p,%p):stub.\n", hWnd, pDropTarget);
|
FIXME("(%p,%p):stub.\n", hWnd, pDropTarget);
|
||||||
if (GetShellOle()) return pRegisterDragDrop(hWnd, pDropTarget);
|
return RegisterDragDrop(hWnd, pDropTarget);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -437,8 +436,7 @@ HRESULT WINAPI SHRegisterDragDrop(
|
||||||
HRESULT WINAPI SHRevokeDragDrop(HWND hWnd)
|
HRESULT WINAPI SHRevokeDragDrop(HWND hWnd)
|
||||||
{
|
{
|
||||||
FIXME("(%p):stub.\n",hWnd);
|
FIXME("(%p):stub.\n",hWnd);
|
||||||
if (GetShellOle()) return pRevokeDragDrop(hWnd);
|
return RevokeDragDrop(hWnd);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -456,8 +454,7 @@ HRESULT WINAPI SHDoDragDrop(
|
||||||
{
|
{
|
||||||
FIXME("(%p %p %p 0x%08lx %p):stub.\n",
|
FIXME("(%p %p %p 0x%08lx %p):stub.\n",
|
||||||
hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect);
|
hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect);
|
||||||
if (GetShellOle()) return pDoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect);
|
return DoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
|
@ -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)))
|
RegisterDragDrop(This->hWnd, pdt);
|
||||||
{
|
|
||||||
pRegisterDragDrop(This->hWnd, pdt);
|
|
||||||
IDropTarget_Release(pdt);
|
IDropTarget_Release(pdt);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* register for receiving notifications */
|
/* register for receiving notifications */
|
||||||
|
@ -1231,10 +1228,8 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
|
||||||
DWORD dwAttributes = SFGAO_CANLINK;
|
DWORD dwAttributes = SFGAO_CANLINK;
|
||||||
DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
|
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 */
|
IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource); /* own DropSource interface */
|
||||||
|
|
||||||
if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, (LPCITEMIDLIST*)This->apidl, &dwAttributes)))
|
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)
|
if (pds)
|
||||||
{
|
{
|
||||||
DWORD dwEffect;
|
DWORD dwEffect;
|
||||||
pDoDragDrop(pda, pds, dwEffect, &dwEffect);
|
DoDragDrop(pda, pds, dwEffect, &dwEffect);
|
||||||
}
|
}
|
||||||
IDataObject_Release(pda);
|
IDataObject_Release(pda);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
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_GETDLGCODE: return SendMessageA(pThis->hWndList,uMessage,0,0);
|
||||||
|
|
||||||
case WM_DESTROY: if(GetShellOle() && pRevokeDragDrop)
|
case WM_DESTROY:
|
||||||
{
|
RevokeDragDrop(pThis->hWnd);
|
||||||
pRevokeDragDrop(pThis->hWnd);
|
|
||||||
}
|
|
||||||
SHChangeNotifyDeregister(pThis->hNotify);
|
SHChangeNotifyDeregister(pThis->hNotify);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -223,7 +223,7 @@ static BOOL DoPaste(
|
||||||
|
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
|
|
||||||
if(SUCCEEDED(pOleGetClipboard(&pda)))
|
if(SUCCEEDED(OleGetClipboard(&pda)))
|
||||||
{
|
{
|
||||||
STGMEDIUM medium;
|
STGMEDIUM medium;
|
||||||
FORMATETC formatetc;
|
FORMATETC formatetc;
|
||||||
|
@ -277,7 +277,7 @@ static BOOL DoPaste(
|
||||||
SHFree(pidl);
|
SHFree(pidl);
|
||||||
|
|
||||||
/* release the medium*/
|
/* release the medium*/
|
||||||
pReleaseStgMedium(&medium);
|
ReleaseStgMedium(&medium);
|
||||||
}
|
}
|
||||||
IDataObject_Release(pda);
|
IDataObject_Release(pda);
|
||||||
}
|
}
|
||||||
|
|
|
@ -362,62 +362,20 @@ static BOOL DoCopyOrCut(
|
||||||
|
|
||||||
TRACE("(%p)->(wnd=%p,bCut=0x%08x)\n",This, hwnd, bCut);
|
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 (SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV)))
|
||||||
if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0)))
|
|
||||||
{
|
{
|
||||||
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)))
|
OleSetClipboard(lpDo);
|
||||||
{
|
IDataObject_Release(lpDo);
|
||||||
pOleSetClipboard(lpDo);
|
|
||||||
IDataObject_Release(lpDo);
|
|
||||||
}
|
|
||||||
IShellView_Release(lpSV);
|
|
||||||
}
|
}
|
||||||
|
IShellView_Release(lpSV);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TRUE;
|
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()
|
* ISvItemCm_fnInvokeCommand()
|
||||||
|
|
Loading…
Reference in New Issue