// INamespaceWalkCB IFACEMETHODIMP FoundItem(IShellFolder *psf, PCUITEMID_CHILD pidl) { HRESULT hr = S_OK; if (_fCountingFiles) { _cFilesTotal++; } else { _cFileCur++; IShellItem2 *psi; hr = SHCreateItemWithParent(NULL, psf, pidl, IID_PPV_ARGS(&psi)); if (SUCCEEDED(hr)) { PWSTR pszName; hr = psi->GetDisplayName(SIGDN_NORMALDISPLAY, &pszName); if (SUCCEEDED(hr)) { _ppd->SetProgress64(_cFileCur, _cFilesTotal); _ppd->SetLine(2, pszName, TRUE, NULL); hr = _ProcessItem(psi); CoTaskMemFree(pszName); } psi->Release(); } } return _ppd->HasUserCancelled() ? HRESULT_FROM_WIN32(ERROR_CANCELLED) : hr; }
int APIENTRY wWinMain(HINSTANCE, HINSTANCE, PWSTR pszCmdLine, int) { HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (SUCCEEDED(hr)) { if (StrStrI(pszCmdLine, L"-Verb")) { IShellItem2 *psi; hr = GetShellItemFromCommandLine(IID_PPV_ARGS(&psi)); if (SUCCEEDED(hr)) { PWSTR pszName; hr = psi->GetDisplayName(SIGDN_PARENTRELATIVEPARSING, &pszName); if (SUCCEEDED(hr)) { WCHAR szMsg[128]; StringCchPrintf(szMsg, ARRAYSIZE(szMsg), L"Item passed via command line is named %s", pszName); MessageBox(NULL, szMsg, L"Create Process Sample Verb", MB_OK); CoTaskMemFree(pszName); } psi->Release(); } } else { CRegisterExtension re(CLSID_NULL); WCHAR const c_szProgID[] = L"txtfile"; WCHAR const c_szVerb[] = L"CreateProcessVerb"; WCHAR const c_szVerbName[] = L"Create Process Verb"; WCHAR szModule[MAX_PATH]; GetModuleFileName(NULL, szModule, ARRAYSIZE(szModule)); // register this verb on .txt files ProgID WCHAR szCmdLine[MAX_PATH + 10]; StringCchPrintf(szCmdLine, ARRAYSIZE(szCmdLine), L"%s -Verb \"%%1\"", szModule); hr = re.RegisterCreateProcessVerb(c_szProgID, c_szVerb, szCmdLine, c_szVerbName); if (SUCCEEDED(hr)) { hr = re.RegisterVerbAttribute(c_szProgID, c_szVerb, L"NeverDefault"); if (SUCCEEDED(hr)) { MessageBox(NULL, L"Installed Create Process Verb Sample for .txt files\n\n" L"right click on a .txt file and choose 'Create Process Verb Sample' to see this in action" , PathFindFileName(szModule), MB_OK); } } } CoUninitialize(); } return 0; }
void OnAppCallback() { DWORD count; _psia->GetCount(&count); IShellItem2 *psi; HRESULT hr = GetItemAt(_psia, 0, IID_PPV_ARGS(&psi)); if (SUCCEEDED(hr)) { PWSTR pszName; hr = psi->GetDisplayName(SIGDN_PARENTRELATIVEPARSING, &pszName); if (SUCCEEDED(hr)) { WCHAR szMsg[128]; StringCchPrintf(szMsg, ARRAYSIZE(szMsg), L"%d item(s), first item is named %s", count, pszName); MessageBox(NULL, szMsg, c_szVerbDisplayName, MB_OK | MB_SETFOREGROUND); CoTaskMemFree(pszName); } psi->Release(); } }
HRESULT GetIDListName(IShellItem *psi, PWSTR *ppsz) { *ppsz = NULL; HRESULT hr = E_FAIL; WCHAR szFullName[2048]; szFullName[0] = 0; PWSTR pszOutput = szFullName; size_t cchOutput = ARRAYSIZE(szFullName); CItemIterator itemIterator(psi); while (itemIterator.MoveNext()) { IShellItem2 *psi; hr = itemIterator.GetCurrent(IID_PPV_ARGS(&psi)); if (SUCCEEDED(hr)) { PWSTR pszName; hr = psi->GetDisplayName(SIGDN_PARENTRELATIVE, &pszName); if (SUCCEEDED(hr)) { // Ignore errors, this is for debugging only StringCchCatEx(pszOutput, cchOutput, L"[", &pszOutput, &cchOutput, 0); StringCchCatEx(pszOutput, cchOutput, pszName, &pszOutput, &cchOutput, 0); StringCchCatEx(pszOutput, cchOutput, L"]", &pszOutput, &cchOutput, 0); CoTaskMemFree(pszName); } psi->Release(); } } if (SUCCEEDED(hr)) { hr = SHStrDup(szFullName, ppsz); } return hr; }