user-0 提问: 浏览文件夹的SHBrowseForFolder

回复:
user: user-1
content: 这个是使用COM接口显示出来的，要用MS VC编译器，不知道其他的编译器支不支持COM接口

user: user-1
content: CFolderPickerDialog应该是MFC封装的类，其他IDE中时没有的

user: user-2
content: win32 真是太麻烦了 qt 1句话就可以实现 QString strfolder = QFileDialog::getExistingDirectory(this, 		QString::fromLocal8Bit("选择路径"), 		strlastPath);  win32用的少，不是没有原因

user: user-0
content: 引用 5 楼 Intel0011 的回复:C++下更简单 #define _WIN32_WINNT 0x0600 #include <afxdlgs.h>  int main(void) {    CFolderPickerDialog fpd;    fpd.DoModal();    printf("%s\n", fpd.m_ofn.lpstrFile);    printf("%s\n", fpd.GetPathName());    return 0; }  我用的DEV，代码都编译不通过，C版的是不识别CLSID_FileOpenDialog，我找了，有这个标识符的声明（DEFINE_GUID(CLSID_FileOpenDialog, 0xdc1c5a9c, 0xe88a, 0x4dde, 0xa5,0xa1, 0x60,0xf8,0x2a,0x20,0xae,0xf7);），但是不识别，不清楚原因，尝试修改了几个宏也不行  C++版的直接找不到CFolderPickerDialog，整个MINGW里都没搜到  这个运行出来是像GetOpenFileName这样的窗口吗？可以截个图看下吗？

user: user-1
content: 花了点时间修正了一下不选择文件夹或文件程序会崩溃的问题 #include <windows.h> #include <stdio.h> #include <Shobjidl.h>  #pragma comment(lib, "Ole32")  int main(void) {    HRESULT hr;    IShellItem *psi = NULL; // Automatically freed    IFileOpenDialog *pfod = NULL;        CoInitialize(NULL);    hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC, &IID_IFileOpenDialog, (LPVOID)&pfod);    if (SUCCEEDED(hr))    {       #if 01       hr = pfod->lpVtbl->SetOptions(pfod, FOS_PICKFOLDERS); //选择文件夹       #elif 0       hr = pfod->lpVtbl->SetOptions(pfod, FOS_FORCEFILESYSTEM); //选择文件       #else       {          DWORD dwOptions;          pfod->lpVtbl->GetOptions(pfod, &dwOptions);          {             COMDLG_FILTERSPEC fileType[] = {                                              { L"All files", L"*.*" },                                              { L"Text files", L"*.txt*" },                                              { L"Pictures", L"*.png" },                                            };             hr = pfod->lpVtbl->SetFileTypes(pfod, ARRAYSIZE(fileType), fileType);          }          hr = pfod->lpVtbl->SetOptions(pfod, dwOptions | FOS_FORCEFILESYSTEM); //选择文件       }       #endif       hr = pfod->lpVtbl->Show(pfod, NULL); //显示对话框       if (SUCCEEDED(hr))       {          /*          对话框显示出来,根据返回值hr就可以判断用户是点击去了取消还是选择了一个文件打开,根据不同的用户选择做出反应          如果用户点击了取消,那么就释放所有的接口指针并返回;如果用户点击了打开,就可以继续调用GetResult方法获取用户选择的项目          */          if (SUCCEEDED(hr))          {             LPWSTR pszPath = NULL;             hr = pfod->lpVtbl->GetResult(pfod, &psi);             if (SUCCEEDED(hr))             {                hr = psi->lpVtbl->GetDisplayName(psi, SIGDN_FILESYSPATH, &pszPath);                if (SUCCEEDED(hr))                {                   _putws(pszPath);                   CoTaskMemFree(pszPath);                }                psi->lpVtbl->Release(psi);             }          }       }       pfod->lpVtbl->Release(pfod);    }    CoUninitialize();        return 0; }

user: user-1
content: C++下更简单 #define _WIN32_WINNT 0x0600 #include <afxdlgs.h>  int main(void) {    CFolderPickerDialog fpd;    fpd.DoModal();    printf("%s\n", fpd.m_ofn.lpstrFile);    printf("%s\n", fpd.GetPathName());    return 0; }

user: user-1
content: #include <windows.h> #include <stdio.h> #include <Shobjidl.h>  #pragma comment(lib, "Ole32")  int main(void) {    HRESULT hr;    IShellItem *psi = NULL; // Automatically freed    IFileOpenDialog *pfod = NULL;    WCHAR *wpath = NULL;     CoInitialize(NULL);    hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC, &IID_IFileOpenDialog, (LPVOID)&pfod);     //不选择文件夹或文件程序会崩溃，有时间再看看    hr = pfod->lpVtbl->SetOptions(pfod, FOS_PICKFOLDERS); //选择文件夹    //hr = pfod->lpVtbl->SetOptions(pfod, FOS_FORCEFILESYSTEM); //选择文件    /*    {       DWORD dwOptions;       pfod->lpVtbl->GetOptions(pfod, &dwOptions);       hr = pfod->lpVtbl->SetOptions(pfod, dwOptions | FOS_FORCEFILESYSTEM); //选择文件    }    //*/    hr = pfod->lpVtbl->Show(pfod, NULL);    hr = pfod->lpVtbl->GetResult(pfod, &psi);    hr = psi->lpVtbl->GetDisplayName(psi, SIGDN_FILESYSPATH, &wpath);     if (SUCCEEDED(hr))    {       _putws(wpath);       CoTaskMemFree(wpath);    }    psi->lpVtbl->Release(psi);    pfod->lpVtbl->Release(pfod);    CoUninitialize();    return 0; }

user: user-3
content: 就用GetOpenFileName啊

user: user-0
content: 引用 1 楼 user-3 的回复:就用GetOpenFileName啊 可是GetOpenFileName选中的是文件而不是文件夹呀，要么跟用户妥协说选其中的文件来指定文件夹，但这太LOW了，或者改变该窗口的外观和行为，但没想到方法