// 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;
}