我可以在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与我的对象相关联?
答案 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的前向定义?