diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index b8954fb5480..4d791f4d54c 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -2066,6 +2066,36 @@ static HRESULT __CLSIDFromString(LPCWSTR s, LPCLSID id) /*****************************************************************************/ +static HRESULT clsid_from_string_reg(LPCOLESTR progid, CLSID *clsid) +{ + static const WCHAR clsidW[] = { '\\','C','L','S','I','D',0 }; + WCHAR buf2[CHARS_IN_GUID]; + LONG buf2len = sizeof(buf2); + HKEY xhkey; + WCHAR *buf; + + memset(clsid, 0, sizeof(*clsid)); + buf = HeapAlloc( GetProcessHeap(),0,(strlenW(progid)+8) * sizeof(WCHAR) ); + strcpyW( buf, progid ); + strcatW( buf, clsidW ); + if (open_classes_key(HKEY_CLASSES_ROOT, buf, MAXIMUM_ALLOWED, &xhkey)) + { + HeapFree(GetProcessHeap(),0,buf); + WARN("couldn't open key for ProgID %s\n", debugstr_w(progid)); + return CO_E_CLASSSTRING; + } + HeapFree(GetProcessHeap(),0,buf); + + if (RegQueryValueW(xhkey,NULL,buf2,&buf2len)) + { + RegCloseKey(xhkey); + WARN("couldn't query clsid value for ProgID %s\n", debugstr_w(progid)); + return CO_E_CLASSSTRING; + } + RegCloseKey(xhkey); + return __CLSIDFromString(buf2,clsid); +} + HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id ) { HRESULT ret; @@ -2076,7 +2106,7 @@ HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id ) ret = __CLSIDFromString(idstr, id); if(ret != S_OK) { /* It appears a ProgID is also valid */ CLSID tmp_id; - ret = CLSIDFromProgID(idstr, &tmp_id); + ret = clsid_from_string_reg(idstr, &tmp_id); if(SUCCEEDED(ret)) *id = tmp_id; } @@ -2301,40 +2331,13 @@ HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *ppszProgID) */ HRESULT WINAPI CLSIDFromProgID(LPCOLESTR progid, LPCLSID clsid) { - static const WCHAR clsidW[] = { '\\','C','L','S','I','D',0 }; - WCHAR buf2[CHARS_IN_GUID]; - LONG buf2len = sizeof(buf2); - HKEY xhkey; - WCHAR *buf; - if (!progid || !clsid) { ERR("neither progid (%p) nor clsid (%p) are optional\n", progid, clsid); return E_INVALIDARG; } - /* initialise clsid in case of failure */ - memset(clsid, 0, sizeof(*clsid)); - - buf = HeapAlloc( GetProcessHeap(),0,(strlenW(progid)+8) * sizeof(WCHAR) ); - strcpyW( buf, progid ); - strcatW( buf, clsidW ); - if (open_classes_key(HKEY_CLASSES_ROOT, buf, MAXIMUM_ALLOWED, &xhkey)) - { - HeapFree(GetProcessHeap(),0,buf); - WARN("couldn't open key for ProgID %s\n", debugstr_w(progid)); - return CO_E_CLASSSTRING; - } - HeapFree(GetProcessHeap(),0,buf); - - if (RegQueryValueW(xhkey,NULL,buf2,&buf2len)) - { - RegCloseKey(xhkey); - WARN("couldn't query clsid value for ProgID %s\n", debugstr_w(progid)); - return CO_E_CLASSSTRING; - } - RegCloseKey(xhkey); - return __CLSIDFromString(buf2,clsid); + return clsid_from_string_reg(progid, clsid); } /****************************************************************************** diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index 3bc98fcfca9..81f099c30b4 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -368,6 +368,15 @@ static void test_CLSIDFromProgID(void) { GUID clsid1; + memset(&clsid, 0xcc, sizeof(clsid)); + hr = CLSIDFromProgID(wszNonExistent, &clsid); + ok(hr == CO_E_CLASSSTRING, "got 0x%08x\n", hr); + ok(IsEqualCLSID(&clsid, &CLSID_NULL), "should have zero CLSID on failure\n"); + + /* CLSIDFromString() doesn't check activation context */ + hr = CLSIDFromString(progidW, &clsid); + ok(hr == CO_E_CLASSSTRING, "got 0x%08x\n", hr); + clsid = CLSID_NULL; hr = CLSIDFromProgID(progidW, &clsid); todo_wine