Move OpenURL() from shdocvw_main.c into intshcut.c, and implement it.

Andrew Bogott andrew at CodeWeavers.com
Thu Nov 4 17:26:34 CDT 2010


---
 dlls/shdocvw/intshcut.c     |   65 +++++++++++++++++++++++++++++++++++++++---
 dlls/shdocvw/shdocvw_main.c |    8 -----
 2 files changed, 60 insertions(+), 13 deletions(-)

diff --git a/dlls/shdocvw/intshcut.c b/dlls/shdocvw/intshcut.c
index 6484de1..8b52613 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 <stdarg.h>
+#include <stdio.h>
+
 #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);
 
@@ -567,6 +571,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;
@@ -579,13 +599,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();
@@ -596,3 +612,42 @@ 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 = HeapAlloc(GetProcessHeap(), 0, 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));
+        }
+
+        if(shortcut)
+            heap_free(shortcut);
+
+        if (urlfilepath)
+            heap_free(urlfilepath);
+    }
+}
diff --git a/dlls/shdocvw/shdocvw_main.c b/dlls/shdocvw/shdocvw_main.c
index f0fa0f6..a0070b4 100644
--- a/dlls/shdocvw/shdocvw_main.c
+++ b/dlls/shdocvw/shdocvw_main.c
@@ -219,14 +219,6 @@ DWORD WINAPI SetQueryNetSessionCount(DWORD arg)
 }
 
 /**********************************************************************
- * 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
  */
 
-- 
1.6.5


--------------040208090804080009000607--



More information about the wine-patches mailing list