Qian Hong : atl: Improved content type handling of AtlAxCreateControlEx.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 22 15:20:46 CST 2015


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

Author: Qian Hong <qhong at codeweavers.com>
Date:   Fri Jan 16 16:09:36 2015 +0800

atl: Improved content type handling of AtlAxCreateControlEx.

---

 dlls/atl/Makefile.in    |  2 +-
 dlls/atl/atl_ax.c       | 69 +++++++++++++++++++++++++++++++++++++++----------
 dlls/atl100/Makefile.in |  2 +-
 dlls/atl100/tests/atl.c |  8 +++---
 dlls/atl110/Makefile.in |  2 +-
 dlls/atl80/Makefile.in  |  2 +-
 dlls/atl90/Makefile.in  |  2 +-
 7 files changed, 65 insertions(+), 22 deletions(-)

diff --git a/dlls/atl/Makefile.in b/dlls/atl/Makefile.in
index 34ae9b8..826a5bf 100644
--- a/dlls/atl/Makefile.in
+++ b/dlls/atl/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = atl.dll
 IMPORTLIB = atl
-IMPORTS   = uuid oleaut32 ole32 user32 gdi32 advapi32
+IMPORTS   = uuid oleaut32 ole32 user32 gdi32 advapi32 shlwapi
 EXTRADEFS = -D_ATL_VER=_ATL_VER_30
 
 C_SRCS = \
diff --git a/dlls/atl/atl_ax.c b/dlls/atl/atl_ax.c
index d16cdfd..15b0550 100644
--- a/dlls/atl/atl_ax.c
+++ b/dlls/atl/atl_ax.c
@@ -35,6 +35,7 @@
 #include "atlbase.h"
 #include "atliface.h"
 #include "atlwin.h"
+#include "shlwapi.h"
 
 #include "wine/unicode.h"
 
@@ -991,6 +992,48 @@ HRESULT WINAPI AtlAxCreateControl(LPCOLESTR lpszName, HWND hWnd,
             NULL, NULL, NULL );
 }
 
+enum content
+{
+    IsEmpty = 0,
+    IsGUID = 1,
+    IsHTML = 2,
+    IsURL = 3,
+    IsUnknown = 4
+};
+
+static enum content get_content_type(LPCOLESTR name, CLSID *control_id)
+{
+    WCHAR new_urlW[MAX_PATH];
+    DWORD size = MAX_PATH;
+    WCHAR mshtml_prefixW[] = {'m','s','h','t','m','l',':','\0'};
+
+    if (!name || !name[0])
+    {
+        WARN("name %s\n", wine_dbgstr_w(name));
+        return IsEmpty;
+    }
+
+    if (CLSIDFromString(name, control_id) == S_OK ||
+        CLSIDFromProgID(name, control_id) == S_OK)
+        return IsGUID;
+
+    if (PathIsURLW (name) ||
+        UrlApplySchemeW(name, new_urlW, &size, URL_APPLY_GUESSSCHEME|URL_APPLY_GUESSFILE) == S_OK)
+    {
+        *control_id = CLSID_WebBrowser;
+        return IsURL;
+    }
+
+    if (!strncmpiW(name, mshtml_prefixW, 7))
+    {
+        FIXME("mshtml prefix not implemented\n");
+        *control_id = CLSID_WebBrowser;
+        return IsHTML;
+    }
+
+    return IsUnknown;
+}
+
 /***********************************************************************
  *           AtlAxCreateControlEx            [atl100.@]
  *
@@ -1005,24 +1048,24 @@ HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd,
     CLSID controlId;
     HRESULT hRes;
     IOleObject *pControl;
-    IUnknown *pUnkControl;
+    IUnknown *pUnkControl = NULL;
     IPersistStreamInit *pPSInit;
-    IUnknown *pContainer;
-    enum {IsGUID=0,IsHTML=1,IsURL=2} content;
+    IUnknown *pContainer = NULL;
+    enum content content;
 
     TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream,
             ppUnkContainer, ppUnkControl, iidSink, punkSink);
 
-    hRes = CLSIDFromString( lpszName, &controlId );
-    if ( FAILED(hRes) )
-        hRes = CLSIDFromProgID( lpszName, &controlId );
-    if ( SUCCEEDED( hRes ) )
-        content = IsGUID;
-    else {
-        /* FIXME - check for MSHTML: prefix! */
-        content = IsURL;
-        controlId = CLSID_WebBrowser;
-    }
+    if (ppUnkContainer) *ppUnkContainer = NULL;
+    if (ppUnkControl) *ppUnkControl = NULL;
+
+    content = get_content_type(lpszName, &controlId);
+
+    if (content == IsEmpty)
+        return S_OK;
+
+    if (content == IsUnknown)
+        return CO_E_CLASSSTRING;
 
     hRes = CoCreateInstance( &controlId, 0, CLSCTX_ALL, &IID_IOleObject,
             (void**) &pControl );
diff --git a/dlls/atl100/Makefile.in b/dlls/atl100/Makefile.in
index 916bd8e..719afe0 100644
--- a/dlls/atl100/Makefile.in
+++ b/dlls/atl100/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = atl100.dll
 IMPORTLIB = atl100
-IMPORTS   = uuid ole32 oleaut32 user32 gdi32 advapi32
+IMPORTS   = uuid ole32 oleaut32 user32 gdi32 advapi32 shlwapi
 EXTRADEFS = -D_ATL_VER=_ATL_VER_100
 PARENTSRC = ../atl
 
diff --git a/dlls/atl100/tests/atl.c b/dlls/atl100/tests/atl.c
index 8cf0a32..699af0a 100644
--- a/dlls/atl100/tests/atl.c
+++ b/dlls/atl100/tests/atl.c
@@ -643,8 +643,8 @@ static void test_ax_win(void)
         ok(hwnd != NULL, "CreateWindow failed!\n");
         control = (IUnknown *)0xdeadbeef;
         res = AtlAxGetControl(hwnd, &control);
-        todo_wine ok(res == E_FAIL, "Expected E_FAIL, returned %08x\n", res);
-        todo_wine ok(!control, "returned %p\n", control);
+        ok(res == E_FAIL, "Expected E_FAIL, returned %08x\n", res);
+        ok(!control, "returned %p\n", control);
         if (control) IUnknown_Release(control);
         DestroyWindow(hwnd);
 
@@ -652,8 +652,8 @@ static void test_ax_win(void)
         ok(hwnd != NULL, "CreateWindow failed!\n");
         control = (IUnknown *)0xdeadbeef;
         res = AtlAxGetControl(hwnd, &control);
-        todo_wine ok(res == E_FAIL, "Expected E_FAIL, returned %08x\n", res);
-        todo_wine ok(!control, "returned %p\n", control);
+        ok(res == E_FAIL, "Expected E_FAIL, returned %08x\n", res);
+        ok(!control, "returned %p\n", control);
         if (control) IUnknown_Release(control);
         DestroyWindow(hwnd);
 
diff --git a/dlls/atl110/Makefile.in b/dlls/atl110/Makefile.in
index ced0f18..49ba933 100644
--- a/dlls/atl110/Makefile.in
+++ b/dlls/atl110/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = atl110.dll
-IMPORTS   = oleaut32 ole32 user32 gdi32 advapi32 uuid
+IMPORTS   = oleaut32 ole32 user32 gdi32 advapi32 uuid shlwapi
 EXTRADEFS = -D_ATL_VER=_ATL_VER_110
 PARENTSRC = ../atl
 
diff --git a/dlls/atl80/Makefile.in b/dlls/atl80/Makefile.in
index 4b7bbd7..b3a5a9c 100644
--- a/dlls/atl80/Makefile.in
+++ b/dlls/atl80/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = atl80.dll
 IMPORTLIB = atl80
-IMPORTS   = oleaut32 user32 ole32 gdi32 advapi32 uuid
+IMPORTS   = oleaut32 user32 ole32 gdi32 advapi32 uuid shlwapi
 EXTRADEFS = -D_ATL_VER=_ATL_VER_80
 PARENTSRC = ../atl
 
diff --git a/dlls/atl90/Makefile.in b/dlls/atl90/Makefile.in
index 5fed63b..d3aebe6 100644
--- a/dlls/atl90/Makefile.in
+++ b/dlls/atl90/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = atl90.dll
-IMPORTS   = oleaut32 user32 ole32 gdi32 advapi32 uuid
+IMPORTS   = oleaut32 user32 ole32 gdi32 advapi32 uuid shlwapi
 EXTRADEFS = -D_ATL_VER=_ATL_VER_90
 PARENTSRC = ../atl
 




More information about the wine-cvs mailing list