在C ++中同时使用IFileDialog和SHBrowseForFolder

时间:2015-07-24 09:10:24

标签: c++ com dialog guid folderbrowserdialog

我从昨天早上起就遇到了一个问题,现在让我发疯了。

问题是我想创建一个对话框来浏览文件夹。 对于早于Vista的每个操作系统,我使用SHBrowseForFolder()方法,该方法工作正常(对于Vista和更新版本)。

对于Vista和更新版本,我想使用IFileDialog因为性能,更好的GUI等。

当我尝试编译IFileDialog的实现代码时,我收到以下“No GUID”错误:

代码:

IFileDialog *pfd = NULL;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));

错误:

error C2787: 'IFileDialog' : no GUID has been associated with this object

在与老板的对话中,他告诉我,由于兼容XP,我们无法将编译器标志设置为vista及以上版本。通过设置编译器标志来解决问题:How do I use iFileDialog in a VC++ 2010 project converted from VC++ 6.0?

无论如何都可以使用IFileDialog吗?也许这个类可以动态链接?

请您就如何实施提出建议? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

您需要使用__uuidof(...)来创建此对象:

IFileDialog *pFileDialog;
hr = CoCreateInstance(__uuidof(FileDialog), NULL, CLSCTX_ALL, 
    __uuidof(pFileDialog), reinterpret_cast<void**>(&pFileDialog));

答案 1 :(得分:0)

如果你想编译使用更高版本SDK(XP后)的代码,你需要设置适当的WINVER。

为完整的项目执行此操作是行不通的,但是对于应该运行以后的Windows操作系统而不是XP的模块应该可以正常工作。

只要您不使用XP中没有的功能,将WINVER设置为比XP更高版本的其中一个模块应该是一个问题。