Author: janderwald
Date: Tue Aug 19 17:40:05 2008
New Revision: 35465
URL:
http://svn.reactos.org/svn/reactos?rev=35465&view=rev
Log:
* The CLSID of a PropertySheet handler can either be present as subkey or as a default
value.
* Fixes WinRar file property sheet handler and etc...
Modified:
trunk/reactos/dll/win32/shell32/shellord.c
Modified: trunk/reactos/dll/win32/shell32/shellord.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shellord…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shellord.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shellord.c [iso-8859-1] Tue Aug 19 17:40:05 2008
@@ -1662,6 +1662,7 @@
IShellPropSheetExt *pspsx;
HKEY hkBase, hkPropSheetHandlers;
PPSXA psxa = NULL;
+ HRESULT hr;
TRACE("(%p,%s,%u)\n", hKey, debugstr_w(pszSubKey), max_iface);
@@ -1699,38 +1700,41 @@
lRet = ERROR_SUCCESS;
break;
}
-
- dwClsidSize = sizeof(szClsidHandler);
- if (SHGetValueW(hkPropSheetHandlers, szHandler, NULL, NULL,
szClsidHandler, &dwClsidSize) == ERROR_SUCCESS)
+ szHandler[(sizeof(szHandler) / sizeof(szHandler[0])) - 1] = 0;
+ hr = SHCLSIDFromStringW(szHandler, &clsid);
+ if (FAILED(hr))
{
- /* Force a NULL-termination and convert the string */
- szClsidHandler[(sizeof(szClsidHandler) / sizeof(szClsidHandler[0])) -
1] = 0;
- if (SUCCEEDED(SHCLSIDFromStringW(szClsidHandler, &clsid)))
+ dwClsidSize = sizeof(szClsidHandler);
+ if (SHGetValueW(hkPropSheetHandlers, szHandler, NULL, NULL,
szClsidHandler, &dwClsidSize) == ERROR_SUCCESS)
{
- /* Attempt to get an IShellPropSheetExt and an IShellExtInit
instance.
- Only if both interfaces are supported it's a real shell
extension.
- Then call IShellExtInit's Initialize method. */
- if (SUCCEEDED(CoCreateInstance(&clsid, NULL,
CLSCTX_INPROC_SERVER/* | CLSCTX_NO_CODE_DOWNLOAD */, &IID_IShellPropSheetExt, (LPVOID
*)&pspsx)))
+ szClsidHandler[(sizeof(szClsidHandler) /
sizeof(szClsidHandler[0])) - 1] = 0;
+ hr = SHCLSIDFromStringW(szClsidHandler, &clsid);
+ }
+ }
+ if (SUCCEEDED(hr))
+ {
+ /* Attempt to get an IShellPropSheetExt and an IShellExtInit
instance.
+ Only if both interfaces are supported it's a real shell
extension.
+ Then call IShellExtInit's Initialize method. */
+ if (SUCCEEDED(CoCreateInstance(&clsid, NULL,
CLSCTX_INPROC_SERVER/* | CLSCTX_NO_CODE_DOWNLOAD */, &IID_IShellPropSheetExt, (LPVOID
*)&pspsx)))
+ {
+ if (SUCCEEDED(pspsx->lpVtbl->QueryInterface(pspsx,
&IID_IShellExtInit, (PVOID *)&psxi)))
{
- if (SUCCEEDED(pspsx->lpVtbl->QueryInterface(pspsx,
&IID_IShellExtInit, (PVOID *)&psxi)))
+ if (SUCCEEDED(psxi->lpVtbl->Initialize(psxi, NULL,
pDataObj, hKey)))
{
- if (SUCCEEDED(psxi->lpVtbl->Initialize(psxi, NULL,
pDataObj, hKey)))
- {
- /* Add the IShellPropSheetExt instance to the array
*/
- psxa->pspsx[psxa->uiCount++] = pspsx;
- }
- else
- {
- psxi->lpVtbl->Release(psxi);
- pspsx->lpVtbl->Release(pspsx);
- }
+ /* Add the IShellPropSheetExt instance to the array */
+ psxa->pspsx[psxa->uiCount++] = pspsx;
}
else
+ {
+ psxi->lpVtbl->Release(psxi);
pspsx->lpVtbl->Release(pspsx);
+ }
}
+ else
+ pspsx->lpVtbl->Release(pspsx);
}
}
-
} while (psxa->uiCount != psxa->uiAllocated);
}
else