/************************************************************************** * ISF_ControlPanel_fnGetDisplayNameOf */ static HRESULT WINAPI ISF_ControlPanel_fnGetDisplayNameOf(IShellFolder2 * iface, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) { ICPanelImpl *This = (ICPanelImpl *)iface; CHAR szPath[MAX_PATH]; WCHAR wszPath[MAX_PATH+1]; /* +1 for potential backslash */ PIDLCPanelStruct* pcpanel; *szPath = '\0'; TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); pdump(pidl); if (!pidl || !strRet) return E_INVALIDARG; pcpanel = _ILGetCPanelPointer(pidl); if (pcpanel) { lstrcpyA(szPath, pcpanel->szName+pcpanel->offsDispName); if (!(dwFlags & SHGDN_FORPARSING)) FIXME("retrieve display name from control panel app\n"); } /* take names of special folders only if its only this folder */ else if (_ILIsSpecialFolder(pidl)) { BOOL bSimplePidl = _ILIsPidlSimple(pidl); if (bSimplePidl) { _ILSimpleGetTextW(pidl, wszPath, MAX_PATH); /* append my own path */ } else { FIXME("special pidl\n"); } if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl) { /* go deeper if needed */ int len = 0; PathAddBackslashW(wszPath); len = lstrlenW(wszPath); if (!SUCCEEDED (SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_INFOLDER, wszPath + len, MAX_PATH + 1 - len))) return E_OUTOFMEMORY; if (!WideCharToMultiByte(CP_ACP, 0, wszPath, -1, szPath, MAX_PATH, NULL, NULL)) wszPath[0] = '\0'; } } strRet->uType = STRRET_CSTR; lstrcpynA(strRet->u.cStr, szPath, MAX_PATH); TRACE("--(%p)->(%s)\n", This, szPath); return S_OK; }
HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST 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 = (int)pcpanel->iconIdx != -1 ? pcpanel->iconIdx : 0; return S_OK; }
static HRESULT WINAPI IShellExecuteHookW_fnExecute(IShellExecuteHookW *iface, LPSHELLEXECUTEINFOW psei) { ICPanelImpl *This = impl_from_IShellExecuteHookW(iface); static const WCHAR wCplopen[] = {'c','p','l','o','p','e','n','\0'}; 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-1); /* 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); sei_tmp = *psei; 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 HRESULT WINAPI ISF_ControlPanel_fnGetDetailsOf(IShellFolder2 *iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) { ICPanelImpl *This = impl_from_IShellFolder2(iface); PIDLCPanelStruct* pcpanel; 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 = IShellFolder2_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); break; case 1: /* comment */ pcpanel = _ILGetCPanelPointer(pidl); if (pcpanel) lstrcpyA(psd->str.u.cStr, pcpanel->szName+pcpanel->offsComment); else _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH); break; } hr = S_OK; } return hr; }
static HRESULT WINAPI IShellExecuteHookA_fnExecute(IShellExecuteHookA *iface, LPSHELLEXECUTEINFOA psei) { ICPanelImpl *This = impl_from_IShellExecuteHookA(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); sei_tmp = *psei; sei_tmp.lpFile = path; sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; ret = ShellExecuteExA(&sei_tmp); if (ret) return S_OK; else return S_FALSE; }
/************************************************************************** * ICPanel_IContextMenu_InvokeCommand() */ HRESULT WINAPI CControlPanelFolder::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) { WCHAR szPath[MAX_PATH]; char szTarget[MAX_PATH]; STRRET strret; WCHAR* pszPath; INT Length, cLength; CComPtr<IPersistFile> ppf; CComPtr<IShellLinkA> isl; HRESULT hResult; PIDLCPanelStruct *pcpanel = _ILGetCPanelPointer(apidl[0]); TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", this, lpcmi, lpcmi->lpVerb, lpcmi->hwnd); if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_OPEN)) //FIXME { LPITEMIDLIST lpIDList = ILCombine(pidlRoot, apidl[0]); if (!pcpanel) { /* UGLY HACK! */ LPSHELLBROWSER lpSB = (LPSHELLBROWSER)SendMessageW(lpcmi->hwnd, CWM_GETISHELLBROWSER, 0, 0); HRESULT hr; 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 { if (!SHGetSpecialFolderPathW(NULL, szPath, CSIDL_DESKTOPDIRECTORY, FALSE)) return E_FAIL; pszPath = PathAddBackslashW(szPath); if (!pszPath) return E_FAIL; if (GetDisplayNameOf(apidl[0], SHGDN_FORPARSING, &strret) != S_OK) return E_FAIL; Length = MAX_PATH - (pszPath - szPath); cLength = strlen(strret.cStr); if (Length < cLength + 5) { FIXME("\n"); return E_FAIL; } if (MultiByteToWideChar(CP_ACP, 0, strret.cStr, cLength + 1, pszPath, Length)) { pszPath += cLength; Length -= cLength; } if (Length > 10) { wcscpy(pszPath, L" - "); cLength = LoadStringW(shell32_hInstance, IDS_LNK_FILE, &pszPath[3], Length - 4) + 3; if (cLength + 5 > Length) cLength = Length - 5; Length -= cLength; pszPath += cLength; } wcscpy(pszPath, L".lnk"); pcpanel = _ILGetCPanelPointer(ILFindLastID(apidl[0])); if (pcpanel) { strncpy(szTarget, pcpanel->szName, MAX_PATH); } else { FIXME("Couldn't retrieve pointer to cpl structure\n"); return E_FAIL; } hResult = CShellLink::_CreatorClass::CreateInstance(NULL, IID_PPV_ARG(IShellLinkA, &isl)); if (SUCCEEDED(hResult)) { isl->SetPath(szTarget); if (SUCCEEDED(isl->QueryInterface(IID_PPV_ARG(IPersistFile,&ppf)))) ppf->Save(szPath, TRUE); } return NOERROR; } return S_OK; }
/************************************************************************** * CControlPanelFolder::GetDisplayNameOf */ HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { CHAR szName[MAX_PATH]; WCHAR wszName[MAX_PATH+1]; /* +1 for potential backslash */ PIDLCPanelStruct *pCPanel; HRESULT hr; *szName = '\0'; TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet); pdump(pidl); if (!pidl) return S_FALSE; pCPanel = _ILGetCPanelPointer(pidl); if (pCPanel) { /* copy display name from pidl - it was retrived from applet before; SHGDN_FORPARSING does not need special handling */ lstrcpyA(szName, pCPanel->szName + pCPanel->offsDispName); } /* take names of special folders only if it's only this folder */ else if (_ILIsSpecialFolder(pidl)) { BOOL bSimplePidl = _ILIsPidlSimple(pidl); SFGAOF Attr = SFGAO_FILESYSTEM; SHELL32_GetItemAttributes(this, pidl, &Attr); if (Attr & SFGAO_FILESYSTEM) { hr = SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName, sizeof(wszName)); if (FAILED(hr)) return hr; } else if (bSimplePidl) { _ILSimpleGetTextW(pidl, wszName, MAX_PATH); /* append my own path */ } else { FIXME("special pidl\n"); if (dwFlags & SHGDN_FORPARSING) { /* go deeper if needed */ int cchName; PathAddBackslashW(wszName); cchName = wcslen(wszName); hr = SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName + cchName, MAX_PATH + 1 - cchName); if (FAILED(hr)) return hr; } } if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL)) szName[0] = '\0'; } strRet->uType = STRRET_CSTR; lstrcpynA(strRet->cStr, szName, MAX_PATH); TRACE("--(%p)->(%s)\n", this, szName); return S_OK; }