Кнопка новой папки, созданная для виртуальной папки, не может быть отображена в CFileDialog

Используя расширение пространства имен оболочки, я создаю виртуальную папку и добавляю кнопку "Новая папка" на панель инструментов, и вижу ее, когда открываю ее с помощью проводника Windows:

Связанный код с кнопкой "Новая папка" прост:

class CFolderViewCommandProvider : public IExplorerCommandProvider
{
public:
// IUnknown
IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv)
{
    static const QITAB qit[] =
    {
        QITABENT(CFolderViewCommandProvider, IExplorerCommandProvider),
        { 0 },
    };
    return QISearch(this, qit, riid, ppv);
}

IFACEMETHODIMP_(ULONG) AddRef() { return InterlockedIncrement(&_cRef); }
IFACEMETHODIMP_(ULONG) Release()
{
    long cRef = InterlockedDecrement(&_cRef);
    if (!cRef)
    {
        delete this;
    }
    return cRef;
}
    // IExplorerCommandProvider
IFACEMETHODIMP GetCommands(IUnknown *punkSite, REFIID riid, void **ppv);
IFACEMETHODIMP GetCommand(REFGUID /* rguidCommandId */, REFIID /* riid */, void **ppv)
    { *ppv = NULL; return E_NOTIMPL; }

CFolderViewCommandProvider() : _cRef(1)
{
}

private:
static HRESULT s_NewFolder(IShellItemArray *psiItemArray, IUnknown *pv);
.
.
.

а также

const FVCOMMANDITEM CFolderViewCommandProvider::c_FVTasks[] =
{

{ &GUID_Settings, IDS_SETTINGS, IDS_SETTINGS, L"shell32.dll,-16710", 0, CFolderViewCommandProvider::s_NewFolder, NULL, 0 }
};

IFACEMETHODIMP CFolderViewCommandProvider::GetCommands(IUnknown * /* punkSite */, REFIID riid, void ** ppv)
{
*ppv = NULL;
CFolderViewCommandEnumerator *pFVCommandEnum = new (std::nothrow) CFolderViewCommandEnumerator(c_FVTasks, ARRAYSIZE(c_FVTasks));
HRESULT hr = pFVCommandEnum ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
    hr = pFVCommandEnum->QueryInterface(riid, ppv);
    pFVCommandEnum->Release();
}
return S_OK;
}
IFACEMETHODIMP CFolderViewCommand::Invoke(IShellItemArray *psiItemArray, IBindCtx *pbc)
{
HRESULT hr = S_OK; // If no function defined - just return S_OK
if (_pfvci && _pfvci->pfnInvoke)
{
    hr = _pfvci->pfnInvoke(psiItemArray, pbc);
}
return hr;
}
.
.
.

Кнопка "Новая папка" просто выскакивает в окне сообщения при нажатии. Но когда я использую CFileDialog чтобы просмотреть эту виртуальную папку, я не могу найти кнопку "Новая папка" на панели инструментов:

Я вижу кнопку "Новая папка" для всех других системных папок, таких как "Документ" или диск C в CFileDialog, но кнопка "Новая папка" для моей виртуальной папки исчезает, когда я открываю ее в CFileDialog. Как решить эту проблему?

0 ответов

Другие вопросы по тегам