Jacek Caban : urlmon: Check if protocol object implements IInternetProtocolInfo interface.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Feb 23 05:28:15 CST 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Feb 22 21:13:01 2007 +0100

urlmon: Check if protocol object implements IInternetProtocolInfo interface.

---

 dlls/urlmon/session.c |   23 +++++++++--------------
 1 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c
index f66b22e..6e80996 100644
--- a/dlls/urlmon/session.c
+++ b/dlls/urlmon/session.c
@@ -55,7 +55,7 @@ static name_space *find_name_space(LPCWSTR protocol)
     return NULL;
 }
 
-static HRESULT get_protocol_iface(LPCWSTR schema, DWORD schema_len, CLSID *pclsid, IUnknown **ret)
+static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid, IClassFactory **ret)
 {
     WCHAR str_clsid[64];
     HKEY hkey = NULL;
@@ -96,14 +96,14 @@ static HRESULT get_protocol_iface(LPCWSTR schema, DWORD schema_len, CLSID *pclsi
     if(pclsid)
         *pclsid = clsid;
 
-    return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)ret);
+    return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IClassFactory, (void**)ret);
 }
 
 IInternetProtocolInfo *get_protocol_info(LPCWSTR url)
 {
     IInternetProtocolInfo *ret = NULL;
+    IClassFactory *cf;
     name_space *ns;
-    IUnknown *unk;
     WCHAR schema[64];
     DWORD schema_len;
     HRESULT hres;
@@ -124,19 +124,20 @@ IInternetProtocolInfo *get_protocol_info(LPCWSTR url)
             return ret;
     }
 
-    hres = get_protocol_iface(schema, schema_len, NULL, &unk);
+    hres = get_protocol_cf(schema, schema_len, NULL, &cf);
     if(FAILED(hres))
         return NULL;
 
-    hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&ret);
-    IUnknown_Release(unk);
+    hres = IClassFactory_QueryInterface(cf, &IID_IInternetProtocolInfo, (void**)&ret);
+    if(FAILED(hres))
+        IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocolInfo, (void**)&ret);
+    IClassFactory_Release(cf);
 
     return ret;
 }
 
 HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, IClassFactory **ret)
 {
-    IUnknown *unk;
     name_space *ns;
     WCHAR schema[64];
     DWORD schema_len;
@@ -155,13 +156,7 @@ HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, IClassFactory **ret)
         return S_OK;
     }
 
-    hres = get_protocol_iface(schema, schema_len, clsid, &unk);
-    if(FAILED(hres))
-        return hres;
-
-    hres = IUnknown_QueryInterface(unk, &IID_IClassFactory, (void**)ret);
-    IUnknown_Release(unk);
-    return hres;
+    return get_protocol_cf(schema, schema_len, clsid, ret);
 }
 
 static HRESULT WINAPI InternetSession_QueryInterface(IInternetSession *iface,




More information about the wine-cvs mailing list