From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/combase/combase.c | 61 +++++++++++++++++++++++++++++++++ dlls/combase/combase.spec | 1 + dlls/ole32/compobj.c | 72 --------------------------------------- dlls/ole32/ole32.spec | 2 +- 4 files changed, 63 insertions(+), 73 deletions(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c index b3a1c9bd8fc..9428f8870aa 100644 --- a/dlls/combase/combase.c +++ b/dlls/combase/combase.c @@ -1239,6 +1239,67 @@ done: return hr; }
+/****************************************************************************** + * CoTreatAsClass (combase.@) + */ +HRESULT WINAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew) +{ + WCHAR clsidW[CHARS_IN_GUID]; + HKEY hkey = NULL; + HRESULT hr; + LONG size; + CLSID id; + + if (FAILED(hr = open_key_for_clsid(clsidOld, NULL, KEY_READ | KEY_WRITE, &hkey))) + return hr; + + if (IsEqualGUID( clsidOld, clsidNew )) + { + size = sizeof(clsidW); + if (!RegQueryValueW(hkey, L"AutoTreatAs", clsidW, &size) && CLSIDFromString(clsidW, &id) == S_OK) + { + if (RegSetValueW(hkey, L"TreatAs", REG_SZ, clsidW, sizeof(clsidW))) + { + hr = REGDB_E_WRITEREGDB; + goto done; + } + } + else + { + if (RegDeleteKeyW(hkey, L"TreatAs")) + hr = REGDB_E_WRITEREGDB; + goto done; + } + } + else + { + if (IsEqualGUID(clsidNew, &CLSID_NULL)) + { + RegDeleteKeyW(hkey, L"TreatAs"); + } + else + { + if (!StringFromGUID2(clsidNew, clsidW, ARRAY_SIZE(clsidW))) + { + WARN("StringFromGUID2 failed\n"); + hr = E_FAIL; + goto done; + } + + if (RegSetValueW(hkey, L"TreatAs", REG_SZ, clsidW, sizeof(clsidW)) != ERROR_SUCCESS) + { + WARN("RegSetValue failed\n"); + hr = REGDB_E_WRITEREGDB; + goto done; + } + } + } + +done: + if (hkey) RegCloseKey(hkey); + return hr; +} + /****************************************************************************** * ProgIDFromCLSID (combase.@) */ diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec index 6d992d4a675..3c1a7e77e54 100644 --- a/dlls/combase/combase.spec +++ b/dlls/combase/combase.spec @@ -164,6 +164,7 @@ @ stdcall CoTaskMemFree(ptr) @ stdcall CoTaskMemRealloc(ptr long) @ stub CoTestCancel +@ stdcall CoTreatAsClass(ptr ptr) @ stdcall CoUninitialize() @ stub CoUnloadingWOW @ stdcall CoUnmarshalHresult(ptr ptr) diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index f6ada46459a..c59c47d0c13 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -678,78 +678,6 @@ HRESULT WINAPI CoSetState(IUnknown * pv) return S_OK; }
- -/****************************************************************************** - * CoTreatAsClass [OLE32.@] - * - * Sets the TreatAs value of a class. - * - * PARAMS - * clsidOld [I] Class to set TreatAs value on. - * clsidNew [I] The class the clsidOld should be treated as. - * - * RETURNS - * Success: S_OK. - * Failure: HRESULT code. - * - * SEE ALSO - * CoGetTreatAsClass - */ -HRESULT WINAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew) -{ - HKEY hkey = NULL; - WCHAR szClsidNew[CHARS_IN_GUID]; - HRESULT res = S_OK; - WCHAR auto_treat_as[CHARS_IN_GUID]; - LONG auto_treat_as_size = sizeof(auto_treat_as); - CLSID id; - - res = COM_OpenKeyForCLSID(clsidOld, NULL, KEY_READ | KEY_WRITE, &hkey); - if (FAILED(res)) - goto done; - - if (IsEqualGUID( clsidOld, clsidNew )) - { - if (!RegQueryValueW(hkey, L"AutoTreatAs", auto_treat_as, &auto_treat_as_size) && - CLSIDFromString(auto_treat_as, &id) == S_OK) - { - if (RegSetValueW(hkey, L"TreatAs", REG_SZ, auto_treat_as, sizeof(auto_treat_as))) - { - res = REGDB_E_WRITEREGDB; - goto done; - } - } - else - { - if (RegDeleteKeyW(hkey, L"TreatAs")) - res = REGDB_E_WRITEREGDB; - goto done; - } - } - else - { - if(IsEqualGUID(clsidNew, &CLSID_NULL)){ - RegDeleteKeyW(hkey, L"TreatAs"); - }else{ - if(!StringFromGUID2(clsidNew, szClsidNew, ARRAY_SIZE(szClsidNew))){ - WARN("StringFromGUID2 failed\n"); - res = E_FAIL; - goto done; - } - - if (RegSetValueW(hkey, L"TreatAs", REG_SZ, szClsidNew, sizeof(szClsidNew)) != ERROR_SUCCESS){ - WARN("RegSetValue failed\n"); - res = REGDB_E_WRITEREGDB; - goto done; - } - } - } - -done: - if (hkey) RegCloseKey(hkey); - return res; -} - /*********************************************************************** * CoIsOle1Class [OLE32.@] * diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec index 7ec85fc963f..222543416ac 100644 --- a/dlls/ole32/ole32.spec +++ b/dlls/ole32/ole32.spec @@ -87,7 +87,7 @@ @ stdcall CoTaskMemAlloc(long) combase.CoTaskMemAlloc @ stdcall CoTaskMemFree(ptr) combase.CoTaskMemFree @ stdcall CoTaskMemRealloc(ptr long) combase.CoTaskMemRealloc -@ stdcall CoTreatAsClass(ptr ptr) +@ stdcall CoTreatAsClass(ptr ptr) combase.CoTreatAsClass @ stdcall CoUninitialize() combase.CoUninitialize @ stub CoUnloadingWOW @ stdcall CoUnmarshalHresult(ptr ptr) combase.CoUnmarshalHresult
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/combase/combase.c | 3 +++ dlls/ole32/tests/compobj.c | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c index 9428f8870aa..3065076581e 100644 --- a/dlls/combase/combase.c +++ b/dlls/combase/combase.c @@ -1250,6 +1250,9 @@ HRESULT WINAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew) LONG size; CLSID id;
+ if (!clsidOld || !clsidNew) + return E_INVALIDARG; + if (FAILED(hr = open_key_for_clsid(clsidOld, NULL, KEY_READ | KEY_WRITE, &hkey))) return hr;
diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index 3f358a8ef8e..2c4cc566f3a 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -2277,7 +2277,7 @@ static void test_TreatAsClass(void) { HRESULT hr; CLSID out; - static GUID deadbeef = {0xdeadbeef,0xdead,0xbeef,{0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef}}; + static const GUID deadbeef = {0xdeadbeef,0xdead,0xbeef,{0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef}}; static const char deadbeefA[] = "{DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF}"; IInternetProtocol *pIP = NULL; HKEY clsidkey, deadbeefkey; @@ -2297,6 +2297,15 @@ static void test_TreatAsClass(void) lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_READ, &clsidkey); ok(!lr, "Couldn't open CLSID key, error %ld\n", lr);
+ hr = CoTreatAsClass(NULL, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = CoTreatAsClass(&deadbeef, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = CoTreatAsClass(NULL, &deadbeef); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + lr = RegCreateKeyExA(clsidkey, deadbeefA, 0, NULL, 0, KEY_WRITE, NULL, &deadbeefkey, NULL); if (lr) { win_skip("CoGetTreatAsClass() tests will be skipped (failed to create a test key, error %ld)\n", lr);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/combase/combase.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c index 3065076581e..27bfe480464 100644 --- a/dlls/combase/combase.c +++ b/dlls/combase/combase.c @@ -1282,13 +1282,7 @@ HRESULT WINAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew) } else { - if (!StringFromGUID2(clsidNew, clsidW, ARRAY_SIZE(clsidW))) - { - WARN("StringFromGUID2 failed\n"); - hr = E_FAIL; - goto done; - } - + StringFromGUID2(clsidNew, clsidW, ARRAY_SIZE(clsidW)); if (RegSetValueW(hkey, L"TreatAs", REG_SZ, clsidW, sizeof(clsidW)) != ERROR_SUCCESS) { WARN("RegSetValue failed\n");
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/combase/combase.c | 9 +++++++++ dlls/combase/combase.spec | 1 + dlls/ole32/compobj.c | 17 ----------------- dlls/ole32/ole32.spec | 2 +- 4 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c index 27bfe480464..34a9a42dc2a 100644 --- a/dlls/combase/combase.c +++ b/dlls/combase/combase.c @@ -3417,6 +3417,15 @@ HRESULT WINAPI CoRegisterSurrogateEx(REFGUID guid, void *reserved) return E_NOTIMPL; }
+/*********************************************************************** + * CoIsOle1Class (combase.@) + */ +BOOL WINAPI CoIsOle1Class(REFCLSID clsid) +{ + FIXME("%s\n", debugstr_guid(clsid)); + return FALSE; +} + /*********************************************************************** * DllMain (combase.@) */ diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec index 3c1a7e77e54..9018b013823 100644 --- a/dlls/combase/combase.spec +++ b/dlls/combase/combase.spec @@ -128,6 +128,7 @@ @ stdcall CoInitializeWOW(long long) @ stub CoInvalidateRemoteMachineBindings @ stdcall CoIsHandlerConnected(ptr) +@ stdcall CoIsOle1Class(ptr) @ stdcall CoLockObjectExternal(ptr long long) @ stdcall CoMarshalHresult(ptr long) @ stdcall CoMarshalInterThreadInterfaceInStream(ptr ptr ptr) diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index c59c47d0c13..b6348e49866 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -678,23 +678,6 @@ HRESULT WINAPI CoSetState(IUnknown * pv) return S_OK; }
-/*********************************************************************** - * CoIsOle1Class [OLE32.@] - * - * Determines whether the specified class an OLE v1 class. - * - * PARAMS - * clsid [I] Class to test. - * - * RETURNS - * TRUE if the class is an OLE v1 class, or FALSE otherwise. - */ -BOOL WINAPI CoIsOle1Class(REFCLSID clsid) -{ - FIXME("%s\n", debugstr_guid(clsid)); - return FALSE; -} - /*********************************************************************** * IsEqualGUID [OLE32.@] * diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec index 222543416ac..c600bc3d97d 100644 --- a/dlls/ole32/ole32.spec +++ b/dlls/ole32/ole32.spec @@ -55,7 +55,7 @@ @ stdcall CoInitializeSecurity(ptr long ptr ptr long long ptr long ptr) combase.CoInitializeSecurity @ stdcall CoInitializeWOW(long long) combase.CoInitializeWOW @ stdcall CoIsHandlerConnected(ptr) combase.CoIsHandlerConnected -@ stdcall CoIsOle1Class (ptr) +@ stdcall CoIsOle1Class(ptr) combase.CoIsOle1Class @ stdcall CoLoadLibrary(wstr long) @ stdcall CoLockObjectExternal(ptr long long) combase.CoLockObjectExternal @ stdcall CoMarshalHresult(ptr long) combase.CoMarshalHresult
This merge request was approved by Huw Davies.