mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
[SHELL32]
- Rewrite the monstrosity that was supposed to open control panel items. Still not really correct but works. svn path=/branches/shell-experiments/; revision=65051
This commit is contained in:
parent
37ebd8e1e4
commit
afb6acc945
2 changed files with 19 additions and 141 deletions
|
@ -763,126 +763,6 @@ HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST pidl, LPWSTR szIconFile, UINT cchM
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
* IShellExecuteHookW Implementation
|
|
||||||
*/
|
|
||||||
|
|
||||||
static HRESULT
|
|
||||||
ExecuteAppletFromCLSID(LPOLESTR pOleStr)
|
|
||||||
{
|
|
||||||
WCHAR wszBuf[128], wszCmd[MAX_PATH];
|
|
||||||
DWORD cbCmd = sizeof(wszCmd);
|
|
||||||
|
|
||||||
StringCbPrintfW(wszBuf, sizeof(wszBuf), L"CLSID\\%s\\shell\\open\\command", pOleStr);
|
|
||||||
|
|
||||||
if (RegGetValueW(HKEY_CLASSES_ROOT, wszBuf, NULL, RRF_RT_REG_SZ, NULL, (PVOID)wszCmd, &cbCmd) != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
ERR("RegGetValueW(%ls) failed with %u\n", wszBuf, GetLastError());
|
|
||||||
return E_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ExpandEnvironmentStringsW(wszCmd, wszBuf, _countof(wszBuf)))
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
PROCESS_INFORMATION pi;
|
|
||||||
STARTUPINFOW si;
|
|
||||||
ZeroMemory(&si, sizeof(si));
|
|
||||||
si.cb = sizeof(si);
|
|
||||||
if (!CreateProcessW(NULL, wszBuf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
CloseHandle(pi.hProcess);
|
|
||||||
CloseHandle(pi.hThread);
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXTERN_C void WINAPI Control_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow);
|
|
||||||
|
|
||||||
HRESULT WINAPI CControlPanelFolder::ExecuteFromIdList(LPCITEMIDLIST pidl)
|
|
||||||
{
|
|
||||||
PIDLCPanelStruct *pCPanel = _ILGetCPanelPointer(ILFindLastID(pidl));
|
|
||||||
|
|
||||||
if (!pCPanel)
|
|
||||||
{
|
|
||||||
/* Is it GUID to control panel applet? */
|
|
||||||
IID *piid = _ILGetGUIDPointer(ILFindLastID(pidl));
|
|
||||||
if (!piid)
|
|
||||||
return E_INVALIDARG;
|
|
||||||
|
|
||||||
/* Start it */
|
|
||||||
LPOLESTR pOleStr;
|
|
||||||
if (StringFromCLSID(*piid, &pOleStr) == S_OK)
|
|
||||||
{
|
|
||||||
HRESULT hr = ExecuteAppletFromCLSID(pOleStr);
|
|
||||||
CoTaskMemFree(pOleStr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ERR("Cannot open cpanel applet\n");
|
|
||||||
return E_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Build control panel applet cmd
|
|
||||||
Note: we pass the applet name to Control_RunDLL to distinguish between multiple applets in one .cpl file */
|
|
||||||
WCHAR wszCmd[2*MAX_PATH];
|
|
||||||
WCHAR wszAppletName[MAX_PATH];
|
|
||||||
|
|
||||||
if(!MultiByteToWideChar(CP_ACP, 0, pCPanel->szName + pCPanel->offsDispName, -1, wszAppletName, MAX_PATH))
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
StringCbPrintfW(wszCmd, sizeof(wszCmd), L"rundll32 shell32.dll,Control_RunDLL \"%hs\",\"%ls\"", pCPanel->szName, wszAppletName);
|
|
||||||
|
|
||||||
/* Start the applet */
|
|
||||||
TRACE("Run cpl %ls\n", wszCmd);
|
|
||||||
STARTUPINFO si;
|
|
||||||
PROCESS_INFORMATION pi;
|
|
||||||
ZeroMemory(&si, sizeof(si));
|
|
||||||
si.cb = sizeof(si);
|
|
||||||
if (!CreateProcessW(NULL, wszCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
CloseHandle(pi.hProcess);
|
|
||||||
CloseHandle(pi.hThread);
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT WINAPI CControlPanelFolder::Execute(LPSHELLEXECUTEINFOW psei)
|
|
||||||
{
|
|
||||||
TRACE("(%p)->execute(%p)\n", this, psei);
|
|
||||||
|
|
||||||
if (!psei)
|
|
||||||
return E_INVALIDARG;
|
|
||||||
|
|
||||||
if (!(psei->fMask & SEE_MASK_IDLIST))
|
|
||||||
{
|
|
||||||
FIXME("no idlist given!\n");
|
|
||||||
return E_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExecuteFromIdList((LPCITEMIDLIST)psei->lpIDList);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
* IShellExecuteHookA Implementation
|
|
||||||
*/
|
|
||||||
|
|
||||||
HRESULT WINAPI CControlPanelFolder::Execute(LPSHELLEXECUTEINFOA psei)
|
|
||||||
{
|
|
||||||
TRACE("(%p)->execute(%p)\n", this, psei);
|
|
||||||
|
|
||||||
if (!psei)
|
|
||||||
return E_INVALIDARG;
|
|
||||||
|
|
||||||
if (!(psei->fMask & SEE_MASK_IDLIST))
|
|
||||||
{
|
|
||||||
FIXME("no idlist given!\n");
|
|
||||||
return E_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExecuteFromIdList((LPCITEMIDLIST)psei->lpIDList);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IContextMenu2 Implementation
|
* IContextMenu2 Implementation
|
||||||
*/
|
*/
|
||||||
|
@ -929,30 +809,38 @@ HRESULT WINAPI CControlPanelFolder::QueryContextMenu(
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI CControlPanelFolder::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
|
HRESULT WINAPI CControlPanelFolder::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
|
||||||
{
|
{
|
||||||
SHELLEXECUTEINFOW sei;
|
|
||||||
WCHAR szPath[MAX_PATH];
|
WCHAR szPath[MAX_PATH];
|
||||||
char szTarget[MAX_PATH];
|
char szTarget[MAX_PATH];
|
||||||
STRRET strret;
|
STRRET strret;
|
||||||
WCHAR* pszPath;
|
WCHAR* pszPath;
|
||||||
INT Length, cLength;
|
INT Length, cLength;
|
||||||
PIDLCPanelStruct *pcpanel;
|
|
||||||
CComPtr<IPersistFile> ppf;
|
CComPtr<IPersistFile> ppf;
|
||||||
CComPtr<IShellLinkA> isl;
|
CComPtr<IShellLinkA> isl;
|
||||||
HRESULT hResult;
|
HRESULT hResult;
|
||||||
|
|
||||||
|
PIDLCPanelStruct *pcpanel = _ILGetCPanelPointer(apidl[0]);
|
||||||
|
|
||||||
TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", this, lpcmi, lpcmi->lpVerb, lpcmi->hwnd);
|
TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", this, lpcmi, lpcmi->lpVerb, lpcmi->hwnd);
|
||||||
|
|
||||||
if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_OPEN)) //FIXME
|
if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_OPEN)) //FIXME
|
||||||
{
|
{
|
||||||
ZeroMemory(&sei, sizeof(sei));
|
LPITEMIDLIST lpIDList = ILCombine(pidlRoot, apidl[0]);
|
||||||
sei.cbSize = sizeof(sei);
|
|
||||||
sei.fMask = SEE_MASK_INVOKEIDLIST;
|
if (!pcpanel)
|
||||||
sei.lpIDList = ILCombine(pidlRoot, apidl[0]);
|
{
|
||||||
sei.hwnd = lpcmi->hwnd;
|
/* UGLY HACK! */
|
||||||
sei.nShow = SW_SHOWNORMAL;
|
LPSHELLBROWSER lpSB = (LPSHELLBROWSER)SendMessageW(lpcmi->hwnd, CWM_GETISHELLBROWSER, 0, 0);
|
||||||
sei.lpVerb = L"open";
|
HRESULT hr;
|
||||||
ERR("here\n");
|
|
||||||
return Execute(&sei);
|
if (lpSB == NULL)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
hr = lpSB->BrowseObject(lpIDList, 0);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Note: we pass the applet name to Control_RunDLL to distinguish between multiple applets in one .cpl file */
|
||||||
|
ShellExecuteA(NULL, "cplopen", pcpanel->szName, pcpanel->szName + pcpanel->offsDispName, NULL, 0);
|
||||||
}
|
}
|
||||||
else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_CREATELINK)) //FIXME
|
else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_CREATELINK)) //FIXME
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,8 +27,6 @@ class CControlPanelFolder :
|
||||||
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
||||||
public IShellFolder2,
|
public IShellFolder2,
|
||||||
public IPersistFolder2,
|
public IPersistFolder2,
|
||||||
public IShellExecuteHookA,
|
|
||||||
public IShellExecuteHookW,
|
|
||||||
public IContextMenu2
|
public IContextMenu2
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -75,12 +73,6 @@ class CControlPanelFolder :
|
||||||
// IPersistFolder2
|
// IPersistFolder2
|
||||||
virtual HRESULT WINAPI GetCurFolder(LPITEMIDLIST * pidl);
|
virtual HRESULT WINAPI GetCurFolder(LPITEMIDLIST * pidl);
|
||||||
|
|
||||||
// IShellExecuteHookW
|
|
||||||
virtual HRESULT WINAPI Execute(LPSHELLEXECUTEINFOW psei);
|
|
||||||
|
|
||||||
// IShellExecuteHookA
|
|
||||||
virtual HRESULT WINAPI Execute(LPSHELLEXECUTEINFOA psei);
|
|
||||||
|
|
||||||
// IContextMenu
|
// IContextMenu
|
||||||
virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
|
virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
|
||||||
virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
|
virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
|
||||||
|
@ -100,8 +92,6 @@ class CControlPanelFolder :
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder)
|
COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder)
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
|
COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist)
|
COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist)
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IShellExecuteHookA, IShellExecuteHookA)
|
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IShellExecuteHookW, IShellExecuteHookW)
|
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
|
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
|
COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
|
||||||
END_COM_MAP()
|
END_COM_MAP()
|
||||||
|
|
Loading…
Reference in a new issue