7

我可以在 VC++ 2010 应用程序中使用 FileSaveDialog(通用项对话框),如下所示:

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 与我的对象关联?

4

2 回答 2

5

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

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

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

谢谢!

于 2011-03-18T20:31:24.690 回答
1

我的 VC++ 6.0 没有定义 IFileDialog,不在基础包中,也不在 Windows SDK 中。你是从某个地方移植回来的吗?

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

编辑:在 VC++ 10 中,IFileDialog 是在 ShObjIdl.h 中的 MIDL_INTERFACE 宏的帮助下定义的。MIDL_INTERFACE 宏在 3 个不同的文件中定义,因此很难判断您选择的是哪个定义;他们都是不同的。但是,我看不到定义不会与 GUID 关联的任何方式。

您是否可以自己进行不包含 GUID 的 IFileDialog 的前向定义?

于 2011-03-18T01:01:57.867 回答