From be01cdb6bf6306119cf3cde93316374cd8a1059e Mon Sep 17 00:00:00 2001 From: Andrew Bogott Date: Thu, 4 Nov 2010 17:26:34 -0500 Subject: [PATCH] shdocvw: Move OpenURL() from shdocvw_main.c into intshcut.c, and implement it. --- dlls/shdocvw/intshcut.c | 62 ++++++++++++++++++++++++++++++++++--- dlls/shdocvw/shdocvw_main.c | 8 ----- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/dlls/shdocvw/intshcut.c b/dlls/shdocvw/intshcut.c index 2f1cad81d80..202a523d1f3 100644 --- a/dlls/shdocvw/intshcut.c +++ b/dlls/shdocvw/intshcut.c @@ -27,6 +27,9 @@ * The installer for the Zuma Deluxe Popcap game is good for testing. */ +#include +#include + #include "wine/debug.h" #include "shdocvw.h" #include "objidl.h" @@ -34,6 +37,7 @@ #include "intshcut.h" #include "shellapi.h" #include "winreg.h" +#include "shlwapi.h" WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); @@ -565,6 +569,22 @@ static const IPersistFileVtbl persistFileVtbl = { PersistFile_GetCurFile }; +static InternetShortcut *create_shortcut(void) +{ + InternetShortcut *newshortcut; + + newshortcut = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(InternetShortcut)); + if (newshortcut) + { + newshortcut->uniformResourceLocatorA.lpVtbl = &uniformResourceLocatorAVtbl; + newshortcut->uniformResourceLocatorW.lpVtbl = &uniformResourceLocatorWVtbl; + newshortcut->persistFile.lpVtbl = &persistFileVtbl; + newshortcut->refCount = 0; + } + + return newshortcut; +} + HRESULT InternetShortcut_Create(IUnknown *pOuter, REFIID riid, void **ppv) { InternetShortcut *This; @@ -577,13 +597,9 @@ HRESULT InternetShortcut_Create(IUnknown *pOuter, REFIID riid, void **ppv) if(pOuter) return CLASS_E_NOAGGREGATION; - This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(InternetShortcut)); + This = create_shortcut(); if (This) { - This->uniformResourceLocatorA.lpVtbl = &uniformResourceLocatorAVtbl; - This->uniformResourceLocatorW.lpVtbl = &uniformResourceLocatorWVtbl; - This->persistFile.lpVtbl = &persistFileVtbl; - This->refCount = 0; hr = Unknown_QueryInterface(This, riid, ppv); if (SUCCEEDED(hr)) SHDOCVW_LockModule(); @@ -594,3 +610,39 @@ HRESULT InternetShortcut_Create(IUnknown *pOuter, REFIID riid, void **ppv) else return E_OUTOFMEMORY; } + + +/********************************************************************** + * OpenURL (SHDOCVW.@) + */ +void WINAPI OpenURL(HWND hWnd, HINSTANCE hInst, LPCSTR lpcstrUrl, int nShowCmd) +{ + InternetShortcut *shortcut; + WCHAR* urlfilepath = NULL; + shortcut = create_shortcut(); + + if (shortcut) + { + int len; + + len = MultiByteToWideChar(CP_ACP, 0, lpcstrUrl, -1, NULL, 0); + urlfilepath = heap_alloc(len * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpcstrUrl, -1, urlfilepath, len); + + if(SUCCEEDED(IPersistFile_Load(&shortcut->persistFile, urlfilepath, 0))) + { + URLINVOKECOMMANDINFOW ici; + + memset( &ici, 0, sizeof ici ); + ici.dwcbSize = sizeof ici; + ici.dwFlags = IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB; + ici.hwndParent = hWnd; + + if FAILED(UniformResourceLocatorW_InvokeCommand(&shortcut->uniformResourceLocatorW, (PURLINVOKECOMMANDINFOW) &ici)) + TRACE("failed to open URL: %s\n.",debugstr_a(lpcstrUrl)); + } + + heap_free(shortcut); + heap_free(urlfilepath); + } +} diff --git a/dlls/shdocvw/shdocvw_main.c b/dlls/shdocvw/shdocvw_main.c index f0fa0f6c1d4..a0070b489d4 100644 --- a/dlls/shdocvw/shdocvw_main.c +++ b/dlls/shdocvw/shdocvw_main.c @@ -218,14 +218,6 @@ DWORD WINAPI SetQueryNetSessionCount(DWORD arg) return 0; } -/********************************************************************** - * OpenURL (SHDOCVW.@) - */ -void WINAPI OpenURL(HWND hWnd, HINSTANCE hInst, LPCSTR lpcstrUrl, int nShowCmd) -{ - FIXME("%p %p %s %d\n", hWnd, hInst, debugstr_a(lpcstrUrl), nShowCmd); -} - /********************************************************************** * Some forwards (by ordinal) to SHLWAPI */