如何防止 SHBrowseForFolder() 创建多个实例?

How to prevent multiple instance creation by SHBrowseForFolder()?

我正在开发一个应用程序,我添加了一个调用 SHBrowseForFolder() 函数的按钮 (CButton)。但问题是该按钮仍然处于活动状态,而且它让我可以单击我的父 window。我也可以一次又一次地点击那个按钮和多次浏览 window 来了。

我想知道的是,有什么方法可以以 DoModal() 的方式使用 SHBrowseForFolder(),以便在用户单击之前控件不会 return 到父 window Ok/Cancel 文件夹浏览按钮 window?我不想在单击一次或类似操作后禁用该按钮。

我正在使用 Visual Studio 2010。 提前致谢。

当然可以:

void CUtility::BrowseFolder(CWnd* pParentWnd, const CString& sTitle, CEdit& Edit)
{
  LPMALLOC pMalloc = NULL;
  ::SHGetMalloc(&pMalloc);

  TCHAR pBuffer[MAX_PATH] = {0};

  LPITEMIDLIST pidlRoot = NULL;

  BROWSEINFO bi;
  bi.hwndOwner = pParentWnd->m_hWnd;
  bi.pidlRoot = NULL;
  bi.pszDisplayName = pBuffer;
  bi.lpszTitle = sTitle;
  bi.ulFlags = BIF_USENEWUI;
  bi.lpfn = NULL;

  if((pidlRoot = ::SHBrowseForFolder(&bi)) == NULL)
    return;

  if(::SHGetPathFromIDList(pidlRoot, pBuffer))
    Edit.SetWindowText(pBuffer);

  if(pidlRoot)
    pMalloc->Free(pidlRoot);
}