文件对话框选择文件

一丶打开文件

CoInitialize(NULL);
	
	IFileOpenDialog * pOpenFileDlg = NULL;
	HRESULT hr = S_FALSE;
	hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_IFileOpenDialog, (LPVOID*)&pOpenFileDlg);

	if (SUCCEEDED(hr))
	{
		hr = pOpenFileDlg->Show(NULL);
		if (SUCCEEDED(hr))
		{
			//从对话框中获取文件名
			IShellItem* pItem;
			hr = pOpenFileDlg->GetResult(&pItem);
			if (SUCCEEDED(hr))
			{
				//结果成功,获取名字.
				PWSTR pszFilePath = NULL;
				hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
				if (SUCCEEDED(hr))
				{
					//进行你的代码操作. pszFilePath = 打开的路径
					CString str(pszFilePath);
					m_ChoosPluginEdt.SetWindowTextW(str);
					CoTaskMemFree(pszFilePath);//释放内存
				}
				pItem->Release();
			}
		}
		pOpenFileDlg->Release();//释放内存
	}

	CoUninitialize();

//保存文件用 IFileSaveDialog 用到再写

获取选择的文件夹

CoInitialize(nullptr);
	IFileDialog* pfd = NULL;
	HRESULT		hr = CoCreateInstance(
		CLSID_FileOpenDialog,
		NULL,
		CLSCTX_INPROC_SERVER,
		IID_PPV_ARGS(&pfd));
	if (SUCCEEDED(hr))
	{
		wstring result;
		pfd->SetOptions(FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM);
		if (pfd->Show(NULL) == S_OK)
		{
			IShellItem* pitem = NULL;
			if (pfd->GetResult(&pitem) == S_OK && pitem)
			{
				LPWSTR resultptr = NULL;
				if (pitem->GetDisplayName(SIGDN_FILESYSPATH, &resultptr) == S_OK && resultptr)
				{
					result = resultptr; //获得文件夹
					CString str(result.c_str());
					edt->SetText(str.GetBuffer());
				}
				pitem->Release();
			}
		}


		CoUninitialize();
		pfd->Release();
	}

多级目录选择.并且返回对应路径.

std::vector<std::wstring> CinstalltoolDlg::SelectFolders() {
  std::vector<std::wstring> paths{};
  HRESULT hr = S_FALSE;
  hr = CoInitialize(NULL);

  IFileOpenDialog* pOpenFileDlg = NULL;
  hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL,
                        IID_IFileOpenDialog, (LPVOID*)&pOpenFileDlg);

  if (SUCCEEDED(hr)) {
    FILEOPENDIALOGOPTIONS options;
    hr = pOpenFileDlg->GetOptions(&options);
    if (FAILED(hr)) {
      // 错误处理
    }
    options |= FOS_PICKFOLDERS | FOS_ALLOWMULTISELECT;  // 设置选择目录模式
    hr = pOpenFileDlg->SetOptions(options);
    if (FAILED(hr)) {
      // 错误处理
    }
    hr = pOpenFileDlg->Show(NULL);
    if (SUCCEEDED(hr)) {
      // 从对话框中获取文件名
      IShellItemArray* pItemArray;
      hr = pOpenFileDlg->GetResults(&pItemArray);
      if (SUCCEEDED(hr)) {
        DWORD count;
        hr = pItemArray->GetCount(&count);
        if (SUCCEEDED(hr)) {
          for (DWORD i = 0; i < count; i++) {
            IShellItem* pItem;
            hr = pItemArray->GetItemAt(i, &pItem);
            if (SUCCEEDED(hr)) {
              LPWSTR pFolderPath;
              hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pFolderPath);
              if (SUCCEEDED(hr)) {
                // 错误处理
                // 处理选定的目录路径
                paths.push_back(pFolderPath);
                CoTaskMemFree(pFolderPath);
              }
            }
            pItem->Release();
          }
          pItemArray->Release();
        }
      }
    }
    pOpenFileDlg->Release();  // 释放内存
  }
  CoUninitialize();
  return paths;
}
posted @ 2020-08-08 10:36  iBinary  阅读(407)  评论(0编辑  收藏  举报