//================================================ void exec_folder_click(const struct _ITEMIDLIST * pidl) { const TCHAR *p = ReadString(extensionsrcPath(), _T("blackbox.options.openFolderCommand:"), NULL); if (p) { TCHAR path[MAX_PATH]; TCHAR buffer[MAX_PATH*2]; if (sh_get_displayname(NULL, pidl, SHGDN_FORPARSING, path)) { post_command(replace_argument1(buffer, MAX_PATH*2, p, path)); return; } } exec_pidl(pidl, _T("explore"), NULL); }
char *replace_shellfolders(char *buffer, const char *path, bool search_path) { char temp [MAX_PATH]; const char *p = unquote(temp, path); if (false == is_relative_path(temp)) return strcpy(buffer, temp); int id = get_csidl(&p); if (CSIDL_BLACKBOX == id || CSIDL_CURTHEME == id) { GetBlackboxPath(buffer, MAX_PATH); buffer[strlen(buffer)-1] = 0; } else if (NO_CSIDL == id) { if (search_path) { if (SearchPath(NULL, temp, ".exe", MAX_PATH, buffer, NULL)) return buffer; else return strcpy(buffer, temp); } GetBlackboxPath(buffer, MAX_PATH); } else { // special folders, like CONTROLS LPITEMIDLIST pID; HRESULT hr = SHGetSpecialFolderLocation(NULL, id, &pID); if (NOERROR != hr) return strcpy(buffer, temp); // returns also things like "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" // (unlike SHGetPathFromIDList) BOOL result = sh_get_displayname(NULL, pID, SHGDN_FORPARSING, buffer); SHMalloc_Free(pID); if (FALSE == result) return strcpy(buffer, temp); } if (p) strcat(buffer, p); return buffer; }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void ShellContext::Invoke(int nCmd) { HRESULT hr = S_OK; if (19 == nCmd) // rename { TCHAR oldName[256]; TCHAR newName[256]; WCHAR newNameW[256]; sh_get_displayname(psfFolder, pidlItem, SHGDN_NORMAL, oldName); if (IDOK == EditBox(_T("bbLean"), _T("Enter new name:"), oldName, newName, 256)) { #ifdef UNICODE wcsncpy_s(newNameW, 256, newName, _TRUNCATE); #else MultiByteToWideChar (CP_ACP, 0, newName, -1, newNameW, 256); #endif hr = psfFolder->SetNameOf(NULL, pidlItem, newNameW, SHGDN_NORMAL, NULL); } } else { CMINVOKECOMMANDINFO ici; ici.cbSize = sizeof(ici); ici.fMask = 0;//CMIC_MASK_FLAG_NO_UI; ici.hwnd = NULL; ici.lpVerb = (const CHAR*)(nCmd - MIN_SHELL_ID); ici.lpParameters = NULL; ici.lpDirectory = NULL; ici.nShow = SW_SHOWNORMAL; ici.dwHotKey = 0; ici.hIcon = NULL; hr = pContextMenu->InvokeCommand(&ici); } if (0==SUCCEEDED(hr)) { ;//MessageBeep(MB_OK); } }