【问题标题】:Using IFileDialog and SHBrowseForFolder simulaneously in C++在 C++ 中同时使用 IFileDialog 和 SHBrowseForFolder
【发布时间】:2015-07-24 09:10:24
【问题描述】:

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

问题是我想创建一个对话框来浏览文件夹。 对于比 Vista 更早的每个操作系统,我都使用 SHBrowseForFolder() 方法,该方法运行良好(也适用于 Vista 和更新版本)。

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

当我尝试为 IFileDialog 编译实现的代码时,我收到以下“无 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 吗?也许类可以动态链接?

能否请您给我一些关于如何实施的建议? 提前致谢。

【问题讨论】:

    标签: c++ com dialog guid folderbrowserdialog


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答,但该代码给了我同样的错误:(
    【解决方案2】:

    如果您要编译使用更高 SDK(XP 后)的代码,您需要设置相应的 WINVER。

    对整个项目执行此操作是行不通的,但对应该在 XP 之后的 Windows 操作系统上运行的模块执行此操作。

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

    【讨论】:

    • 您能告诉我在哪里设置 WINVER 以及使用哪个代码吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2011-02-08
    • 2018-04-09
    • 2018-07-10
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多