📄 cpanelfolder.c
字号:
return E_NOTIMPL;
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultColumn(IShellFolder2 * iface, DWORD dwRes, ULONG * pSort, ULONG * pDisplay)
{
ICPanelImpl *This = (ICPanelImpl *)iface;
TRACE("(%p)\n", This);
if (pSort) *pSort = 0;
if (pDisplay) *pDisplay = 0;
return S_OK;
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultColumnState(IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags)
{
ICPanelImpl *This = (ICPanelImpl *)iface;
TRACE("(%p)\n", This);
if (!pcsFlags || iColumn >= CONROLPANELSHELLVIEWCOLUMNS) return E_INVALIDARG;
*pcsFlags = ControlPanelSFHeader[iColumn].pcsFlags;
return S_OK;
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDetailsEx(IShellFolder2 * iface, LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv)
{
ICPanelImpl *This = (ICPanelImpl *)iface;
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDetailsOf(IShellFolder2 * iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd)
{
ICPanelImpl *This = (ICPanelImpl *)iface;
HRESULT hr;
TRACE("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd);
if (!psd || iColumn >= CONROLPANELSHELLVIEWCOLUMNS)
return E_INVALIDARG;
if (!pidl) {
psd->fmt = ControlPanelSFHeader[iColumn].fmt;
psd->cxChar = ControlPanelSFHeader[iColumn].cxChar;
psd->str.uType = STRRET_CSTR;
LoadStringA(shell32_hInstance, ControlPanelSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH);
return S_OK;
} else {
psd->str.u.cStr[0] = 0x00;
psd->str.uType = STRRET_CSTR;
switch(iColumn) {
case 0: /* name */
hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
break;
case 1: /* comment */
_ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH);
break;
}
hr = S_OK;
}
return hr;
}
static HRESULT WINAPI ISF_ControlPanel_fnMapColumnToSCID(IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid)
{
ICPanelImpl *This = (ICPanelImpl *)iface;
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static const IShellFolder2Vtbl vt_ShellFolder2 =
{
ISF_ControlPanel_fnQueryInterface,
ISF_ControlPanel_fnAddRef,
ISF_ControlPanel_fnRelease,
ISF_ControlPanel_fnParseDisplayName,
ISF_ControlPanel_fnEnumObjects,
ISF_ControlPanel_fnBindToObject,
ISF_ControlPanel_fnBindToStorage,
ISF_ControlPanel_fnCompareIDs,
ISF_ControlPanel_fnCreateViewObject,
ISF_ControlPanel_fnGetAttributesOf,
ISF_ControlPanel_fnGetUIObjectOf,
ISF_ControlPanel_fnGetDisplayNameOf,
ISF_ControlPanel_fnSetNameOf,
/* ShellFolder2 */
ISF_ControlPanel_fnGetDefaultSearchGUID,
ISF_ControlPanel_fnEnumSearches,
ISF_ControlPanel_fnGetDefaultColumn,
ISF_ControlPanel_fnGetDefaultColumnState,
ISF_ControlPanel_fnGetDetailsEx,
ISF_ControlPanel_fnGetDetailsOf,
ISF_ControlPanel_fnMapColumnToSCID
};
/************************************************************************
* ICPanel_PersistFolder2_QueryInterface
*/
static HRESULT WINAPI ICPanel_PersistFolder2_QueryInterface(IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObject)
{
ICPanelImpl *This = impl_from_IPersistFolder2(iface);
TRACE("(%p)\n", This);
return IUnknown_QueryInterface(_IUnknown_(This), iid, ppvObject);
}
/************************************************************************
* ICPanel_PersistFolder2_AddRef
*/
static ULONG WINAPI ICPanel_PersistFolder2_AddRef(IPersistFolder2 * iface)
{
ICPanelImpl *This = impl_from_IPersistFolder2(iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
return IUnknown_AddRef(_IUnknown_(This));
}
/************************************************************************
* ISFPersistFolder_Release
*/
static ULONG WINAPI ICPanel_PersistFolder2_Release(IPersistFolder2 * iface)
{
ICPanelImpl *This = impl_from_IPersistFolder2(iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
return IUnknown_Release(_IUnknown_(This));
}
/************************************************************************
* ICPanel_PersistFolder2_GetClassID
*/
static HRESULT WINAPI ICPanel_PersistFolder2_GetClassID(IPersistFolder2 * iface, CLSID * lpClassId)
{
ICPanelImpl *This = impl_from_IPersistFolder2(iface);
TRACE("(%p)\n", This);
if (!lpClassId)
return E_POINTER;
*lpClassId = CLSID_ControlPanel;
return S_OK;
}
/************************************************************************
* ICPanel_PersistFolder2_Initialize
*
* NOTES: it makes no sense to change the pidl
*/
static HRESULT WINAPI ICPanel_PersistFolder2_Initialize(IPersistFolder2 * iface, LPCITEMIDLIST pidl)
{
ICPanelImpl *This = impl_from_IPersistFolder2(iface);
TRACE("(%p)->(%p)\n", This, pidl);
return E_NOTIMPL;
}
/**************************************************************************
* IPersistFolder2_fnGetCurFolder
*/
static HRESULT WINAPI ICPanel_PersistFolder2_GetCurFolder(IPersistFolder2 * iface, LPITEMIDLIST * pidl)
{
ICPanelImpl *This = impl_from_IPersistFolder2(iface);
TRACE("(%p)->(%p)\n", This, pidl);
if (!pidl)
return E_POINTER;
*pidl = ILClone(This->pidlRoot);
return S_OK;
}
static const IPersistFolder2Vtbl vt_PersistFolder2 =
{
ICPanel_PersistFolder2_QueryInterface,
ICPanel_PersistFolder2_AddRef,
ICPanel_PersistFolder2_Release,
ICPanel_PersistFolder2_GetClassID,
ICPanel_PersistFolder2_Initialize,
ICPanel_PersistFolder2_GetCurFolder
};
HRESULT CPanel_GetIconLocationW(LPITEMIDLIST pidl,
LPWSTR szIconFile, UINT cchMax, int* piIndex)
{
PIDLCPanelStruct* pcpanel = _ILGetCPanelPointer(pidl);
if (!pcpanel)
return E_INVALIDARG;
MultiByteToWideChar(CP_ACP, 0, pcpanel->szName, -1, szIconFile, cchMax);
*piIndex = pcpanel->iconIdx!=-1? pcpanel->iconIdx: 0;
return S_OK;
}
/**************************************************************************
* IShellExecuteHookW Implementation
*/
static HRESULT WINAPI IShellExecuteHookW_fnQueryInterface(
IShellExecuteHookW* iface, REFIID riid, void** ppvObject)
{
ICPanelImpl *This = impl_from_IShellExecuteHookW(iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
}
static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnAddRef(IShellExecuteHookW* iface)
{
ICPanelImpl *This = impl_from_IShellExecuteHookW(iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
return IUnknown_AddRef(This->pUnkOuter);
}
static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnRelease(IShellExecuteHookW* iface)
{
ICPanelImpl *This = impl_from_IShellExecuteHookW(iface);
TRACE("(%p)\n", This);
return IUnknown_Release(This->pUnkOuter);
}
static HRESULT WINAPI IShellExecuteHookW_fnExecute(IShellExecuteHookW* iface, LPSHELLEXECUTEINFOW psei)
{
static const WCHAR wCplopen[] = {'c','p','l','o','p','e','n','\0'};
ICPanelImpl *This = (ICPanelImpl *)iface;
SHELLEXECUTEINFOW sei_tmp;
PIDLCPanelStruct* pcpanel;
WCHAR path[MAX_PATH];
WCHAR params[MAX_PATH];
BOOL ret;
int l;
TRACE("(%p)->execute(%p)\n", This, psei);
if (!psei)
return E_INVALIDARG;
pcpanel = _ILGetCPanelPointer(ILFindLastID(psei->lpIDList));
if (!pcpanel)
return E_INVALIDARG;
path[0] = '\"';
/* Return value from MultiByteToWideChar includes terminating NUL, which
* compensates for the starting double quote we just put in */
l = MultiByteToWideChar(CP_ACP, 0, pcpanel->szName, -1, path+1, MAX_PATH);
/* pass applet name to Control_RunDLL to distinguish between applets in one .cpl file */
path[l++] = '"';
path[l] = '\0';
MultiByteToWideChar(CP_ACP, 0, pcpanel->szName+pcpanel->offsDispName, -1, params, MAX_PATH);
memcpy(&sei_tmp, psei, sizeof(sei_tmp));
sei_tmp.lpFile = path;
sei_tmp.lpParameters = params;
sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST;
sei_tmp.lpVerb = wCplopen;
ret = ShellExecuteExW(&sei_tmp);
if (ret)
return S_OK;
else
return S_FALSE;
}
static const IShellExecuteHookWVtbl vt_ShellExecuteHookW =
{
IShellExecuteHookW_fnQueryInterface,
IShellExecuteHookW_fnAddRef,
IShellExecuteHookW_fnRelease,
IShellExecuteHookW_fnExecute
};
/**************************************************************************
* IShellExecuteHookA Implementation
*/
static HRESULT WINAPI IShellExecuteHookA_fnQueryInterface(IShellExecuteHookA* iface, REFIID riid, void** ppvObject)
{
ICPanelImpl *This = impl_from_IShellExecuteHookA(iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
}
static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnAddRef(IShellExecuteHookA* iface)
{
ICPanelImpl *This = impl_from_IShellExecuteHookA(iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
return IUnknown_AddRef(This->pUnkOuter);
}
static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnRelease(IShellExecuteHookA* iface)
{
ICPanelImpl *This = impl_from_IShellExecuteHookA(iface);
TRACE("(%p)\n", This);
return IUnknown_Release(This->pUnkOuter);
}
static HRESULT WINAPI IShellExecuteHookA_fnExecute(IShellExecuteHookA* iface, LPSHELLEXECUTEINFOA psei)
{
ICPanelImpl *This = (ICPanelImpl *)iface;
SHELLEXECUTEINFOA sei_tmp;
PIDLCPanelStruct* pcpanel;
char path[MAX_PATH];
BOOL ret;
TRACE("(%p)->execute(%p)\n", This, psei);
if (!psei)
return E_INVALIDARG;
pcpanel = _ILGetCPanelPointer(ILFindLastID(psei->lpIDList));
if (!pcpanel)
return E_INVALIDARG;
path[0] = '\"';
lstrcpyA(path+1, pcpanel->szName);
/* pass applet name to Control_RunDLL to distinguish between applets in one .cpl file */
lstrcatA(path, "\" ");
lstrcatA(path, pcpanel->szName+pcpanel->offsDispName);
memcpy(&sei_tmp, psei, sizeof(sei_tmp));
sei_tmp.lpFile = path;
sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST;
ret = ShellExecuteExA(&sei_tmp);
if (ret)
return S_OK;
else
return S_FALSE;
}
static const IShellExecuteHookAVtbl vt_ShellExecuteHookA =
{
IShellExecuteHookA_fnQueryInterface,
IShellExecuteHookA_fnAddRef,
IShellExecuteHookA_fnRelease,
IShellExecuteHookA_fnExecute
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -