[SHELL32][CONTROL] Added basic IOpenControlPanel support (#6248)

Add a basic IOpenControlPanel implementation that supports Vista canonical registry names.

Implements `control.exe /name company.name [/page id]` and `IOpenControlPanel`
handling of Vista-style canonical registry names.

The documented `Microsoft.*` names don't work because they are simply not
in our registry but "[Executable Control Panel Items](https://learn.microsoft.com/en-us/windows/win32/shell/how-to-register-an-executable-control-panel-item-registration-)" registered by 3rd-party ISVs
will function correctly in control.exe and the COM API.

Notes:

- `IOpenControlPanel` is implemented in CControlPanelFolder.cpp because
  it is supposed to have tighter integration with that shell folder than
  it does in this PR.

- `IOpenControlPanel` is also supposed to handle .cpl files with canonical
  names registered under [`Extended Properties`](https://learn.microsoft.com/en-us/windows/win32/shell/how-to-register-dll-control-panel-item-registration-#step-3) but the control panel folder
  does not implement `IShellFolder2::GetDetailsEx` yet, so it will have to wait.

- These "Executable Control Panel Items" are also supposed to be displayed
  in the control panel itself but this PR does not address that. The
  `ITEMIDLIST` format for those needs investigation...

- The Wow64 handling is perhaps not correct but it does not matter,
  `ShellExecuteEx` gets to deal with whatever is in the `...\shell\open\command` key.
  `CControlPanelFolder` would have to take more care when it starts
  reading those keys so it knows when to append "(32-bit)" to the display name.

- `%s%s` because .cpl canonical names don't have the `::` prefix according
  to Geoff Chappell.

- Always returns `CPVIEW_CLASSIC` because our `CControlPanelFolder` does
  not support the category view.
This commit is contained in:
Whindmar Saksit 2024-01-17 17:07:21 +01:00 committed by GitHub
parent fb43301bad
commit d41dec2e07
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 281 additions and 1 deletions

View file

@ -2360,6 +2360,37 @@ interface IExplorerCommandProvider : IUnknown
[out, iid_is(riid)] void **ppv);
};
/*****************************************************************************
* IOpenControlPanel interface (Vista+)
*/
[
object,
uuid(D11AD862-66DE-4DF4-BF6C-1F5621996AF1),
pointer_default(unique)
]
interface IOpenControlPanel : IUnknown
{
typedef [v1_enum] enum CPVIEW
{
CPVIEW_CLASSIC = 0,
CPVIEW_CATEGORY = 1,
CPVIEW_ALLITEMS = CPVIEW_CLASSIC,
CPVIEW_HOME = CPVIEW_CATEGORY
} CPVIEW;
HRESULT Open(
[in, optional] LPCWSTR pszName,
[in, optional] LPCWSTR pszPage,
[in, optional] IUnknown *punkSite);
HRESULT GetPath(
[in, optional] LPCWSTR pszName,
[out, string, size_is(cchPath)] LPWSTR pszPath,
[in] UINT cchPath);
HRESULT GetCurrentView(
[out] CPVIEW *pView);
}
#endif // __REACTOS__
/*****************************************************************************