如何在VC ++ 6.0转换的VC ++ 2010项目中使用iFileDialog?

时间:2011-03-17 23:19:06

标签: windows winapi visual-c++ com visual-c++-2010

我可以在VC ++ 2010应用程序中使用FileSaveDialog(Common Item Dialog),如下所示:

IFileDialog *pFileDialog;
HRESULT hr = CoCreateInstance(CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFileDialog));    

但是当我将此代码放入已从VC ++ 6.0转换为VC ++ 2010的项目中时,我收到以下错误:

  

“错误C2787:'IFileDialog':没有与此对象关联的GUID”

我在IID_PPV_ARGS宏和浮动错误下也出现了红色波形:

  

“_uuidof的操作数必须具有已指定_declspec(uuid('...'))的类或枚举类型”

我没有在任何一个项目中使用公共语言运行时支持(/ clr)。

如何将GUID与我的对象相关联?

2 个答案:

答案 0 :(得分:5)

问题是我设置了一个针对Win XP操作系统的编译器标志。这就是为什么Vista中引入的功能没有定义的原因。

我有_WIN32_WINNT = 0x0501(WinXP)。当我将其更改为0x0600(Vista)时,定义了IFileDialog。

马克,你关于调查IFileDialog定义的建议引导我找到原因。它引导我进入ShObjIdl.h文件,但定义了IFileDialog的部分显示为灰色,导致我达到#if (NTDDI_VERSION >= NTDDI_VISTA)条件。

谢谢!

答案 1 :(得分:1)

我的VC ++ 6.0没有定义IFileDialog,不在基本包中,也不在Windows SDK中。你从某个地方把它移回了吗?

我会看看VC ++ 10中IFileDialog的定义。我猜它是用某些宏的好处定义的,并且该宏包含或排除了_declspec(uuid('...')),具体取决于设置的一些编译时常量错。

编辑:在VC ++ 10中,IFileDialog是在SHObjIdl.h中借助MIDL_INTERFACE宏定义的。 MIDL_INTERFACE宏在3个不同的文件中定义,因此很难分辨出你正在拾取的定义;他们都是不同的。但是,我没有看到任何定义与GUID无关的方式。

你是否有可能在自己的IFileDialog上做一个不包含GUID的前向定义?