typedef struct {
ICOM_VFIELD(IShellFolder2);
DWORD ref;
- ICOM_VTABLE(IPersistFolder2) * lpVtblPersistFolder2;
+
+ ICOM_VTABLE(IPersistFolder2)* lpVtblPersistFolder2;
+ ICOM_VTABLE(IShellExecuteHookW)* lpVtblShellExecuteHookW;
+ ICOM_VTABLE(IShellExecuteHookA)* lpVtblShellExecuteHookA;
+
+ IUnknown *pUnkOuter; /* used for aggregation */
/* both paths are parsible from the desktop */
LPITEMIDLIST pidlRoot; /* absolute pidl */
int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */
-} IGenericSFImpl;
+} ICPanelImpl;
+
+static ICOM_VTABLE(IShellFolder2) vt_ShellFolder2;
+static ICOM_VTABLE(IPersistFolder2) vt_PersistFolder2;
+static ICOM_VTABLE(IShellExecuteHookW) vt_ShellExecuteHookW;
+static ICOM_VTABLE(IShellExecuteHookA) vt_ShellExecuteHookA;
+
+#define _IPersistFolder2_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblPersistFolder2)))
+#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This =(class*)(((char*)name)-_IPersistFolder2_Offset);
-static struct ICOM_VTABLE(IShellFolder2) vt_ShellFolder2;
-static struct ICOM_VTABLE(IPersistFolder2) vt_PersistFolder2;
+#define IShellExecuteHookW_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblShellExecuteHookW)))
+#define _ICOM_THIS_From_IShellExecuteHookW(class, name) class* This =(class*)(((char*)name)-IShellExecuteHookW_Offset);
+
+#define IShellExecuteHookA_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblShellExecuteHookA)))
+#define _ICOM_THIS_From_IShellExecuteHookA(class, name) class* This =(class*)(((char*)name)-IShellExecuteHookA_Offset);
-#define _IPersistFolder2_Offset ((int)(&(((IGenericSFImpl*)0)->lpVtblPersistFolder2)))
-#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder2_Offset);
/*
converts This to a interface pointer
*/
-#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl)
-#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl)
-#define _IShellFolder2_(This) (IShellFolder2*)&(This->lpVtbl)
+#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl)
+#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl)
+#define _IShellFolder2_(This) (IShellFolder2*)&(This->lpVtbl)
-#define _IPersist_(This) (IPersist*)&(This->lpVtblPersistFolder2)
-#define _IPersistFolder_(This) (IPersistFolder*)&(This->lpVtblPersistFolder2)
-#define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpVtblPersistFolder2)
+#define _IPersist_(This) (IPersist*)&(This->lpVtblPersistFolder2)
+#define _IPersistFolder_(This) (IPersistFolder*)&(This->lpVtblPersistFolder2)
+#define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpVtblPersistFolder2)
+#define _IShellExecuteHookW_(This) (IShellExecuteHookW*)&(This->lpVtblShellExecuteHookW)
+#define _IShellExecuteHookA_(This) (IShellExecuteHookA*)&(This->lpVtblShellExecuteHookA)
/***********************************************************************
* IShellFolder [ControlPanel] implementation
/**************************************************************************
* IControlPanel_Constructor
*/
-HRESULT WINAPI IControlPanel_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
+HRESULT WINAPI IControlPanel_Constructor(IUnknown* pUnkOuter, REFIID riid, LPVOID * ppv)
{
- IGenericSFImpl *sf;
+ ICPanelImpl *sf;
TRACE("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid(riid));
if (!ppv)
return E_POINTER;
- if (pUnkOuter)
+ if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown))
return CLASS_E_NOAGGREGATION;
- sf = (IGenericSFImpl *) LocalAlloc(GMEM_ZEROINIT, sizeof(IGenericSFImpl));
+ sf = (ICPanelImpl *) LocalAlloc(GMEM_ZEROINIT, sizeof(ICPanelImpl));
if (!sf)
return E_OUTOFMEMORY;
sf->ref = 0;
sf->lpVtbl = &vt_ShellFolder2;
sf->lpVtblPersistFolder2 = &vt_PersistFolder2;
+ sf->lpVtblShellExecuteHookW = &vt_ShellExecuteHookW;
+ sf->lpVtblShellExecuteHookA = &vt_ShellExecuteHookA;
sf->pidlRoot = _ILCreateControl(); /* my qualified pidl */
+ sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_ (sf);
if (!SUCCEEDED(IUnknown_QueryInterface(_IUnknown_(sf), riid, ppv))) {
IUnknown_Release(_IUnknown_(sf));
*
* NOTES supports not IPersist/IPersistFolder
*/
-static HRESULT WINAPI ISF_ControlPanel_fnQueryInterface(IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj)
+static HRESULT WINAPI ISF_ControlPanel_fnQueryInterface(IShellFolder2 * iface, REFIID riid, LPVOID * ppvObject)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
- TRACE("(%p)->(%s,%p)\n", This, shdebugstr_guid(riid), ppvObj);
+ TRACE("(%p)->(%s,%p)\n", This, shdebugstr_guid(riid), ppvObject);
- *ppvObj = NULL;
+ *ppvObject = NULL;
if (IsEqualIID(riid, &IID_IUnknown) ||
- IsEqualIID(riid, &IID_IShellFolder) || IsEqualIID(riid, &IID_IShellFolder2)) {
- *ppvObj = This;
- } else if (IsEqualIID(riid, &IID_IPersist) ||
- IsEqualIID(riid, &IID_IPersistFolder) || IsEqualIID(riid, &IID_IPersistFolder2)) {
- *ppvObj = _IPersistFolder2_(This);
- }
-
- if (*ppvObj) {
- IUnknown_AddRef((IUnknown *)(*ppvObj));
- TRACE("-- Interface:(%p)->(%p)\n", ppvObj, *ppvObj);
+ IsEqualIID(riid, &IID_IShellFolder) || IsEqualIID(riid, &IID_IShellFolder2))
+ *ppvObject = This;
+ else if (IsEqualIID(riid, &IID_IPersist) ||
+ IsEqualIID(riid, &IID_IPersistFolder) || IsEqualIID(riid, &IID_IPersistFolder2))
+ *ppvObject = _IPersistFolder2_(This);
+ else if (IsEqualIID(riid, &IID_IShellExecuteHookW))
+ *ppvObject = _IShellExecuteHookW_(This);
+ else if (IsEqualIID(riid, &IID_IShellExecuteHookA))
+ *ppvObject = _IShellExecuteHookA_(This);
+
+ if (*ppvObject) {
+ IUnknown_AddRef((IUnknown *)(*ppvObject));
+ TRACE("-- Interface:(%p)->(%p)\n", ppvObject, *ppvObject);
return S_OK;
}
TRACE("-- Interface: E_NOINTERFACE\n");
static ULONG WINAPI ISF_ControlPanel_fnAddRef(IShellFolder2 * iface)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
static ULONG WINAPI ISF_ControlPanel_fnRelease(IShellFolder2 * iface)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
LPOLESTR lpszDisplayName,
DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
- HRESULT hr = E_OUTOFMEMORY;
- LPCWSTR szNext = NULL;
- WCHAR szElement[MAX_PATH];
- CHAR szTempA[MAX_PATH];
- LPITEMIDLIST pidlTemp = NULL;
- CLSID clsid;
+ HRESULT hr = E_INVALIDARG;
- TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
+ FIXME("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
This, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), pchEaten, ppidl, pdwAttributes);
*ppidl = 0;
if (pchEaten)
*pchEaten = 0;
- /* handle CLSID paths */
- if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':') {
- szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
- TRACE("-- element: %s\n", debugstr_w(szElement));
- SHCLSIDFromStringW(szElement + 2, &clsid);
- pidlTemp = _ILCreate(PT_MYCOMP, &clsid, sizeof(clsid));
- }
- /* do we have an absolute path name ? */
- else if (PathGetDriveNumberW(lpszDisplayName)>=0 && lpszDisplayName[2]==(WCHAR) '\\') {
- szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
- WideCharToMultiByte(CP_ACP, 0, szElement, -1, szTempA, MAX_PATH, NULL, NULL);
- pidlTemp = _ILCreateDrive(szTempA);
- }
-
- if (szNext && *szNext) {
- hr = SHELL32_ParseNextElement(iface, hwndOwner, pbc, &pidlTemp,(LPOLESTR) szNext, pchEaten, pdwAttributes);
- } else {
- if (pdwAttributes && *pdwAttributes) {
- SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
- }
- hr = S_OK;
- }
-
- *ppidl = pidlTemp;
-
TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
return hr;
static HRESULT WINAPI
ISF_ControlPanel_fnEnumObjects(IShellFolder2 * iface, HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
TRACE("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList);
ISF_ControlPanel_fnBindToObject(IShellFolder2 * iface, LPCITEMIDLIST pidl,
LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", This, pidl, pbcReserved, shdebugstr_guid(riid), ppvOut);
ISF_ControlPanel_fnBindToStorage(IShellFolder2 * iface,
LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", This, pidl, pbcReserved, shdebugstr_guid(riid), ppvOut);
static HRESULT WINAPI
ISF_ControlPanel_fnCompareIDs(IShellFolder2 * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
int nReturn;
static HRESULT WINAPI
ISF_ControlPanel_fnCreateViewObject(IShellFolder2 * iface, HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
LPSHELLVIEW pShellView;
HRESULT hr = E_INVALIDARG;
static HRESULT WINAPI
ISF_ControlPanel_fnGetAttributesOf(IShellFolder2 * iface, UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
HRESULT hr = S_OK;
HWND hwndOwner,
UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
LPITEMIDLIST pidl;
IUnknown *pObj = NULL;
*ppvOut = NULL;
if (IsEqualIID(riid, &IID_IContextMenu) &&(cidl >= 1)) {
- pObj = (LPUNKNOWN) ISvItemCm_Constructor((IShellFolder *) iface, This->pidlRoot, apidl, cidl);
+ pObj =(LPUNKNOWN) ISvItemCm_Constructor((IShellFolder *) iface, This->pidlRoot, apidl, cidl);
hr = S_OK;
} else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1)) {
- pObj = (LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl);
+ pObj =(LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl);
hr = S_OK;
} else if (IsEqualIID(riid, &IID_IExtractIconA) &&(cidl == 1)) {
pidl = ILCombine(This->pidlRoot, apidl[0]);
- pObj = (LPUNKNOWN) IExtractIconA_Constructor(pidl);
+ pObj =(LPUNKNOWN) IExtractIconA_Constructor(pidl);
SHFree(pidl);
hr = S_OK;
} else if (IsEqualIID(riid, &IID_IExtractIconW) &&(cidl == 1)) {
pidl = ILCombine(This->pidlRoot, apidl[0]);
- pObj = (LPUNKNOWN) IExtractIconW_Constructor(pidl);
+ pObj =(LPUNKNOWN) IExtractIconW_Constructor(pidl);
SHFree(pidl);
hr = S_OK;
- } else if (IsEqualIID(riid, &IID_IDropTarget) &&(cidl >= 1)) {
- hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget,(LPVOID *) & pObj);
} else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA))
&&(cidl >= 1)) {
pidl = ILCombine(This->pidlRoot, apidl[0]);
*/
static HRESULT WINAPI ISF_ControlPanel_fnGetDisplayNameOf(IShellFolder2 * iface, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
CHAR szPath[MAX_PATH*2];
PIDLCPanelStruct* pcpanel;
pcpanel = _ILGetCPanelPointer(pidl);
if (pcpanel) {
- if (dwFlags & SHGDN_FORPARSING) {
- lstrcpyA(szPath, "\"");
- lstrcpyA(szPath+1, pcpanel->szName);
-
- /* pass applet name to Control_RunDLL to distinguish between applets in one .cpl file */
- lstrcatA(szPath, "\" ");
- lstrcatA(szPath, pcpanel->szName+pcpanel->offsDispName);
- } else
- lstrcpyA(szPath, pcpanel->szName+pcpanel->offsDispName);
+ lstrcpyA(szPath, pcpanel->szName+pcpanel->offsDispName);
if (!(dwFlags & SHGDN_FORPARSING))
FIXME("retrieve display name from control panel app\n");
FIXME("special pidl\n");
}
- if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl) { /* go deeper if needed */
+ if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl) { /* go deeper if needed */
int len = 0;
PathAddBackslashA(szPath); /*FIXME*/
len = lstrlenA(szPath);
if (!SUCCEEDED
- (SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_INFOLDER, szPath + len, MAX_PATH - len)))
+ (SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_INFOLDER, szPath + len, MAX_PATH - len)))
return E_OUTOFMEMORY;
}
}
static HRESULT WINAPI ISF_ControlPanel_fnSetNameOf(IShellFolder2 * iface, HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */
LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl, debugstr_w(lpName), dwFlags, pPidlOut);
return E_FAIL;
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultSearchGUID(IShellFolder2 * iface, GUID * pguid)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI ISF_ControlPanel_fnEnumSearches(IShellFolder2 * iface, IEnumExtraSearch ** ppenum)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultColumn(IShellFolder2 * iface, DWORD dwRes, ULONG * pSort, ULONG * pDisplay)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
TRACE("(%p)\n", This);
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultColumnState(IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
TRACE("(%p)\n", This);
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDetailsEx(IShellFolder2 * iface, LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI ISF_ControlPanel_fnGetDetailsOf(IShellFolder2 * iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
HRESULT hr;
TRACE("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd);
}
static HRESULT WINAPI ISF_ControlPanel_fnMapColumnToSCID(IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid)
{
- ICOM_THIS(IGenericSFImpl, iface);
+ ICOM_THIS(ICPanelImpl, iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static ICOM_VTABLE(IShellFolder2) vt_ShellFolder2 =
{
- ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
- 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
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+
+ 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
};
/************************************************************************
- * IMCFldr_PersistFolder2_QueryInterface
+ * ICPanel_PersistFolder2_QueryInterface
*/
-static HRESULT WINAPI IMCFldr_PersistFolder2_QueryInterface(IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObj)
+static HRESULT WINAPI ICPanel_PersistFolder2_QueryInterface(IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObject)
{
- _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
+ _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface);
TRACE("(%p)\n", This);
- return IUnknown_QueryInterface(_IUnknown_(This), iid, ppvObj);
+ return IUnknown_QueryInterface(_IUnknown_(This), iid, ppvObject);
}
/************************************************************************
- * IMCFldr_PersistFolder2_AddRef
+ * ICPanel_PersistFolder2_AddRef
*/
-static ULONG WINAPI IMCFldr_PersistFolder2_AddRef(IPersistFolder2 * iface)
+static ULONG WINAPI ICPanel_PersistFolder2_AddRef(IPersistFolder2 * iface)
{
- _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
+ _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
/************************************************************************
* ISFPersistFolder_Release
*/
-static ULONG WINAPI IMCFldr_PersistFolder2_Release(IPersistFolder2 * iface)
+static ULONG WINAPI ICPanel_PersistFolder2_Release(IPersistFolder2 * iface)
{
- _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
+ _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface);
TRACE("(%p)->(count=%lu)\n", This, This->ref);
}
/************************************************************************
- * IMCFldr_PersistFolder2_GetClassID
+ * ICPanel_PersistFolder2_GetClassID
*/
-static HRESULT WINAPI IMCFldr_PersistFolder2_GetClassID(IPersistFolder2 * iface, CLSID * lpClassId)
+static HRESULT WINAPI ICPanel_PersistFolder2_GetClassID(IPersistFolder2 * iface, CLSID * lpClassId)
{
- _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
+ _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface);
TRACE("(%p)\n", This);
}
/************************************************************************
- * IMCFldr_PersistFolder2_Initialize
+ * ICPanel_PersistFolder2_Initialize
*
* NOTES: it makes no sense to change the pidl
*/
-static HRESULT WINAPI IMCFldr_PersistFolder2_Initialize(IPersistFolder2 * iface, LPCITEMIDLIST pidl)
+static HRESULT WINAPI ICPanel_PersistFolder2_Initialize(IPersistFolder2 * iface, LPCITEMIDLIST pidl)
{
- _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
+ _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface);
TRACE("(%p)->(%p)\n", This, pidl);
return E_NOTIMPL;
}
/**************************************************************************
* IPersistFolder2_fnGetCurFolder
*/
-static HRESULT WINAPI IMCFldr_PersistFolder2_GetCurFolder(IPersistFolder2 * iface, LPITEMIDLIST * pidl)
+static HRESULT WINAPI ICPanel_PersistFolder2_GetCurFolder(IPersistFolder2 * iface, LPITEMIDLIST * pidl)
{
- _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
+ _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface);
TRACE("(%p)->(%p)\n", This, pidl);
static ICOM_VTABLE(IPersistFolder2) vt_PersistFolder2 =
{
-ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
- IMCFldr_PersistFolder2_QueryInterface,
- IMCFldr_PersistFolder2_AddRef,
- IMCFldr_PersistFolder2_Release,
- IMCFldr_PersistFolder2_GetClassID,
- IMCFldr_PersistFolder2_Initialize,
- IMCFldr_PersistFolder2_GetCurFolder
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+
+ ICPanel_PersistFolder2_QueryInterface,
+ ICPanel_PersistFolder2_AddRef,
+ ICPanel_PersistFolder2_Release,
+ ICPanel_PersistFolder2_GetClassID,
+ ICPanel_PersistFolder2_Initialize,
+ ICPanel_PersistFolder2_GetCurFolder
};
HRESULT WINAPI CPanel_GetIconLocationA(LPITEMIDLIST pidl, LPSTR szIconFile, UINT cchMax, int* piIndex)
return S_OK;
}
+
+
+/**************************************************************************
+* IShellExecuteHookW Implementation
+*/
+
+static HRESULT WINAPI IShellExecuteHookW_fnQueryInterface(IShellExecuteHookW* iface, REFIID riid, void** ppvObject)
+{
+ _ICOM_THIS_From_IShellExecuteHookW(ICPanelImpl, iface);
+
+ TRACE("(%p)->(count=%lu)\n", This, This->ref);
+
+ return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
+}
+
+static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnAddRef(IShellExecuteHookW* iface)
+{
+ _ICOM_THIS_From_IShellExecuteHookW(ICPanelImpl, iface);
+
+ TRACE("(%p)->(count=%lu)\n", This, This->ref);
+
+ return IUnknown_AddRef(This->pUnkOuter);
+}
+
+static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnRelease(IShellExecuteHookW* iface)
+{
+ _ICOM_THIS_From_IShellExecuteHookW(ICPanelImpl, iface);
+
+ TRACE("(%p)\n", This);
+
+ return IUnknown_Release(This->pUnkOuter);
+}
+
+static HRESULT WINAPI IShellExecuteHookW_fnExecute(IShellExecuteHookW* iface, LPSHELLEXECUTEINFOW psei)
+{
+ ICOM_THIS(ICPanelImpl, iface);
+
+ SHELLEXECUTEINFOW sei_tmp;
+ PIDLCPanelStruct* pcpanel;
+ WCHAR path[MAX_PATH];
+ BOOL ret;
+ int l;
+
+ TRACE("(%p)->execute(%x)\n", This, psei);
+
+ if (!psei)
+ return E_INVALIDARG;
+
+ pcpanel = _ILGetCPanelPointer(ILFindLastID(psei->lpIDList));
+
+ if (!pcpanel)
+ return E_INVALIDARG;
+
+ path[0] = '\"';
+ l = 1 + 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 */
+ lstrcpyW(path+1, L"\" ");
+ l += 2;
+
+ MultiByteToWideChar(CP_ACP, 0, pcpanel->szName+pcpanel->offsDispName, -1, path+l, MAX_PATH);
+
+ memcpy(&sei_tmp, psei, sizeof(sei_tmp));
+ sei_tmp.lpFile = path;
+ sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST;
+
+ ret = ShellExecuteExW(&sei_tmp);
+ if (ret)
+ return S_OK;
+ else
+ return S_FALSE;
+}
+
+static ICOM_VTABLE(IShellExecuteHookW) vt_ShellExecuteHookW =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+
+ IShellExecuteHookW_fnQueryInterface,
+ IShellExecuteHookW_fnAddRef,
+ IShellExecuteHookW_fnRelease,
+
+ IShellExecuteHookW_fnExecute
+};
+
+
+/**************************************************************************
+* IShellExecuteHookA Implementation
+*/
+
+static HRESULT WINAPI IShellExecuteHookA_fnQueryInterface(IShellExecuteHookA* iface, REFIID riid, void** ppvObject)
+{
+ _ICOM_THIS_From_IShellExecuteHookA(ICPanelImpl, iface);
+
+ TRACE("(%p)->(count=%lu)\n", This, This->ref);
+
+ return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
+}
+
+static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnAddRef(IShellExecuteHookA* iface)
+{
+ _ICOM_THIS_From_IShellExecuteHookA(ICPanelImpl, iface);
+
+ TRACE("(%p)->(count=%lu)\n", This, This->ref);
+
+ return IUnknown_AddRef(This->pUnkOuter);
+}
+
+static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnRelease(IShellExecuteHookA* iface)
+{
+ _ICOM_THIS_From_IShellExecuteHookA(ICPanelImpl, iface);
+
+ TRACE("(%p)\n", This);
+
+ return IUnknown_Release(This->pUnkOuter);
+}
+
+static HRESULT WINAPI IShellExecuteHookA_fnExecute(IShellExecuteHookA* iface, LPSHELLEXECUTEINFOA psei)
+{
+ ICOM_THIS(ICPanelImpl, iface);
+
+ SHELLEXECUTEINFOA sei_tmp;
+ PIDLCPanelStruct* pcpanel;
+ char path[MAX_PATH];
+ BOOL ret;
+
+ TRACE("(%p)->execute(%x)\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 ICOM_VTABLE(IShellExecuteHookA) vt_ShellExecuteHookA =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+
+ IShellExecuteHookA_fnQueryInterface,
+ IShellExecuteHookA_fnAddRef,
+ IShellExecuteHookA_fnRelease,
+
+ IShellExecuteHookA_fnExecute
+};