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