Jacek Caban : shdocvw: Added beginning iexplore DDE suport.

Alexandre Julliard julliard at winehq.org
Mon Jan 10 10:55:17 CST 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jan  7 19:06:17 2011 +0100

shdocvw: Added beginning iexplore DDE suport.

---

 dlls/shdocvw/iexplore.c |  138 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 138 insertions(+), 0 deletions(-)

diff --git a/dlls/shdocvw/iexplore.c b/dlls/shdocvw/iexplore.c
index 5c03b9c..48fcf97 100644
--- a/dlls/shdocvw/iexplore.c
+++ b/dlls/shdocvw/iexplore.c
@@ -37,6 +37,7 @@
 #include "winreg.h"
 #include "shlwapi.h"
 #include "intshcut.h"
+#include "ddeml.h"
 
 #include "wine/debug.h"
 
@@ -51,6 +52,8 @@ static const WCHAR wszWineInternetExplorer[] =
         {'W','i','n','e',' ','I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',0};
 
 static LONG obj_cnt;
+static DWORD dde_inst;
+static HSZ ddestr_iexplore, ddestr_openurl;
 
 HRESULT update_ie_statustext(InternetExplorer* This, LPCWSTR text)
 {
@@ -840,6 +843,138 @@ void released_obj(void)
         PostQuitMessage(0);
 }
 
+static ULONG open_dde_url(WCHAR *dde_url)
+{
+    IWebBrowser2 *wb;
+    WCHAR *url, *url_end;
+    VARIANT urlv;
+    HRESULT hres;
+
+    TRACE("%s\n", debugstr_w(dde_url));
+
+    url = dde_url;
+    if(*url == '"') {
+        url++;
+        url_end = strchrW(url, '"');
+        if(!url_end) {
+            FIXME("missing string terminator\n");
+            return 0;
+        }
+        *url_end = 0;
+    }else {
+        url_end = strchrW(url, ',');
+        if(url_end)
+            *url_end = 0;
+        else
+            url_end = url + strlenW(url);
+    }
+
+    hres = InternetExplorer_Create(NULL, &IID_IWebBrowser2, (void**)&wb);
+    if(FAILED(hres))
+        return 0;
+
+    IWebBrowser2_put_Visible(wb, VARIANT_TRUE);
+    IWebBrowser2_put_MenuBar(wb, VARIANT_TRUE);
+
+    V_VT(&urlv) = VT_BSTR;
+    V_BSTR(&urlv) = SysAllocStringLen(url, url_end-url);
+    if(!V_BSTR(&urlv)) {
+        IWebBrowser2_Release(wb);
+        return 0;
+    }
+
+    hres = IWebBrowser2_Navigate2(wb, &urlv, NULL, NULL, NULL, NULL);
+    if(FAILED(hres))
+        return 0;
+
+    IWebBrowser2_Release(wb);
+    return DDE_FACK;
+}
+
+static HDDEDATA WINAPI dde_proc(UINT type, UINT uFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA data,
+        ULONG_PTR dwData1, ULONG_PTR dwData2)
+{
+    switch(type) {
+    case XTYP_CONNECT:
+        TRACE("XTYP_CONNECT %p\n", hsz1);
+        return (HDDEDATA)!DdeCmpStringHandles(hsz1, ddestr_openurl);
+
+    case XTYP_EXECUTE: {
+        WCHAR *url;
+        DWORD size;
+        HDDEDATA ret;
+
+        TRACE("XTYP_EXECUTE %p\n", data);
+
+        size = DdeGetData(data, NULL, 0, 0);
+        if(!size) {
+            WARN("size = 0\n");
+            break;
+        }
+
+        url = heap_alloc(size);
+        if(!url)
+            break;
+
+        if(DdeGetData(data, (BYTE*)url, size, 0) != size) {
+            ERR("error during read\n");
+            break;
+        }
+
+        ret = (HDDEDATA)open_dde_url(url);
+
+        heap_free(url);
+        return ret;
+    }
+
+    case XTYP_REQUEST:
+        FIXME("XTYP_REQUEST\n");
+        break;
+
+    default:
+        TRACE("type %d\n", type);
+    }
+
+    return NULL;
+}
+
+static void init_dde(void)
+{
+    UINT res;
+
+    static const WCHAR iexploreW[] = {'I','E','x','p','l','o','r','e',0};
+    static const WCHAR openurlW[] = {'W','W','W','_','O','p','e','n','U','R','L',0};
+
+    res = DdeInitializeW(&dde_inst, dde_proc, CBF_SKIP_ALLNOTIFICATIONS | CBF_FAIL_ADVISES | CBF_FAIL_POKES, 0);
+    if(res != DMLERR_NO_ERROR) {
+        WARN("DdeInitialize failed: %u\n", res);
+        return;
+    }
+
+    ddestr_iexplore = DdeCreateStringHandleW(dde_inst, iexploreW, CP_WINUNICODE);
+    if(!ddestr_iexplore)
+        WARN("Failed to create string handle: %u\n", DdeGetLastError(dde_inst));
+
+    ddestr_openurl = DdeCreateStringHandleW(dde_inst, openurlW, CP_WINUNICODE);
+    if(!ddestr_openurl)
+        WARN("Failed to create string handle: %u\n", DdeGetLastError(dde_inst));
+
+    res = (ULONG)DdeNameService(dde_inst, ddestr_iexplore, 0, DNS_REGISTER);
+    if(res != DMLERR_NO_ERROR)
+        WARN("DdeNameService failed: %u\n", res);
+}
+
+static void release_dde(void)
+{
+    if(ddestr_iexplore)
+        DdeNameService(dde_inst, ddestr_iexplore, 0, DNS_UNREGISTER);
+    if(ddestr_openurl)
+        DdeFreeStringHandle(dde_inst, ddestr_openurl);
+    if(ddestr_iexplore)
+        DdeFreeStringHandle(dde_inst, ddestr_iexplore);
+    DdeUninitialize(dde_inst);
+}
+
 /******************************************************************
  *		IEWinMain            (SHDOCVW.101)
  *
@@ -867,6 +1002,8 @@ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
         ExitProcess(1);
     }
 
+    init_dde();
+
     if(strcasecmp(szCommandLine, "-embedding")) {
         if(!create_ie_window(szCommandLine)) {
             CoUninitialize();
@@ -882,6 +1019,7 @@ DWORD WINAPI IEWinMain(LPSTR szCommandLine, int nShowWindow)
     }
 
     register_class_object(FALSE);
+    release_dde();
 
     CoUninitialize();
 




More information about the wine-cvs mailing list