2

By using shell namespace extension, I create a virtual folder and add a "New Folder" button on the toolbar, and I can see the button when I use windows explorer to open it: enter image description here

The related code about the "New Folder" button is simple:

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);
.
.
.

and

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

Thew "New Folder" button just simply pops up a message box when it is clicked. But when I use CFileDialog to browse this virtual folder, I cannot find any "New Folder" button in the tool bar:

enter image description here

I can see "New Folder" button for all other system folders like under "Document" or C drive in the CFileDialog, but the "New Folder" button for my virtual folder disappears when I open it in CFileDialog. How to fix that problem?

beasone
  • 1,073
  • 1
  • 14
  • 32

0 Answers0