Andrew Bogott : shdocvw: Move OpenURL() from shdocvw_main.c into intshcut.c , and implement it.

Alexandre Julliard julliard at winehq.org
Fri Nov 12 11:22:34 CST 2010


Module: wine
Branch: master
Commit: be01cdb6bf6306119cf3cde93316374cd8a1059e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=be01cdb6bf6306119cf3cde93316374cd8a1059e

Author: Andrew Bogott <andrew at CodeWeavers.com>
Date:   Thu Nov  4 17:26:34 2010 -0500

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 2f1cad8..202a523 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);
 
@@ -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 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
  */
 




More information about the wine-cvs mailing list