错误 C2787 时构建项目使用 ATL 3.0

各位高手能帮我解决下面的问题吗?为什么会出现下列问题?

Hook.cpp
c:/documents and settings/administrator.e5a23b0b99c7427/桌面/ch08/hook/showhook.h(34) : error C2787: “IShellExecuteHookA”: 没有与该对象关联的 GUID
c:/documents and settings/administrator.e5a23b0b99c7427/桌面/ch08/hook/showhook.h(34) : error C2440: “初始化”: 无法从“DWORD_PTR”转换为“const IID *”
        从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换
c:/documents and settings/administrator.e5a23b0b99c7427/桌面/ch08/hook/showhook.h(34) : error C2440: “初始化”: 无法从“ATL::_ATL_CREATORARGFUNC (__stdcall *)”转换为“DWORD_PTR”
        没有使该转换得以执行的上下文
ShowHook.cpp
c:/documents and settings/administrator.e5a23b0b99c7427/桌面/ch08/hook/showhook.h(34) : error C2787: “IShellExecuteHookA”: 没有与该对象关联的 GUID
c:/documents and settings/administrator.e5a23b0b99c7427/桌面/ch08/hook/showhook.h(34) : error C2440: “初始化”: 无法从“DWORD_PTR”转换为“const IID *”
        从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换
c:/documents and settings/administrator.e5a23b0b99c7427/桌面/ch08/hook/showhook.h(34) : error C2440: “初始化”: 无法从“ATL::_ATL_CREATORARGFUNC (__stdcall *)”转换为“DWORD_PTR”
        没有使该转换得以执行的上下文
正在生成代码...
生成日志保存在“file://c:/Documents and Settings/Administrator.E5A23B0B99C7427/桌面/Ch08/Hook/Debug/BuildLog.htm”
Hook - 6 个错误,0 个警告

 

 


文章编号: 192561 - 最后修改: 2003年12月10日 - 修订: 2.0

PRB: 错误 C2787 时构建项目使用 ATL 3.0

本页

症状
生成使用 ATL 3.0 的项目时可能会收到一个编译器错误 c2787 (没有 GUID 已与此对象关联)。

生成使用 ATL 3.0 的项目时可能会收到一个编译器错误 c2787 (没有 GUID 已与此对象关联)。

原因
较新版本的 MIDL 使用编译器设施 [__declspec(uuid())] 标记到它生成的头文件中的接口的 GUID。ATL 版本 3.0 使用这一事实 C...

较新版本的 MIDL 使用编译器设施 [__declspec(uuid())] 标记到它生成的头文件中的接口的 GUID。ATL 版本 3.0 使用这一事实 COM_INTERFACE_ENRY 宏的实现中 ; 现在,它使用关键字 __uuidof() 从 MIDL 生成标头中提取接口 ID。ATL 2.1 使用标记粘贴运算符 (IID_ ##IFoo) 获取接口 id。此操作要求包括 MIDL 生成标头和也在"project_i.c",MIDL 生成。

如果您使用 ATL 3.0 的较旧的 MIDL 生成的头文件 [这不会使用 __declspec(uuid())],您将获得此编译器错误,因为 __uudiof() 不能提取接口 id。

解决方案
在项目设置对话框中的 C/c + + 选项卡中定义的预处理器符号 _ATL_NO_UUIDOF。这将强制 ATL 使用标记粘贴运算符 (#) 而不是 __uui...

在项目设置对话框中的 C/c + + 选项卡中定义的预处理器符号 _ATL_NO_UUIDOF。这将强制 ATL 使用标记粘贴运算符 (#) 而不是 __uuidof() 时形成接口 id。

状态
此行为是设计使然。

此行为是设计使然。

更多信息
示例代码 COM_INTERFACE_ENTRY in ATL 2.1 #define COM_INTERFACE_ENTRY(x)/ {&IID_##x),...

示例代码

   COM_INTERFACE_ENTRY in ATL 2.1
   
      #define COM_INTERFACE_ENTRY(x)/ 
         {&IID_##x), / 
         offsetofclass(x, _ComMapClass), / 
         _ATL_SIMPLEMAPENTRY},
   
   COM_INTERFACE_ENTRY in ATL 3.0
   
      #ifndef _ATL_NO_UUIDOF
      #define _ATL_IIDOF(x) __uuidof(x)
      #else
      #define _ATL_IIDOF(x) IID_##x
      #endif
   
      #define COM_INTERFACE_ENTRY(x)/ 
         {&_ATL_IIDOF(x), / 
         offsetofclass(x, _ComMapClass), / 
         _ATL_SIMPLEMAPENTRY},
				
较新的 MIDL 标头文件使用该宏 DECLSPEC_UUID() 或 MIDL_INTERFACE(),__declspec(uuid()) 来展开。MIDL 版本 3.01.75 和以后使用 __declspec 指令。

参考
"移植从 ATL 2.1"联机帮助中。 (c) Microsoft Corporation 1998,保留的所有权限。通过贡献 Jaganathan Thang...

"移植从 ATL 2.1"联机帮助中。

(c) Microsoft Corporation 1998,保留的所有权限。通过贡献 Jaganathan Thangavelu,Microsoft 公司。

这篇文章中的信息适用于:
  • Microsoft ActiveX Template Library 3.0 当用于
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
关键字: 
kbmt kbmidl kbprb KB192561 KbMtzh
机器翻译 机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 192561  (http://support.microsoft.com/kb/192561/en-us/ )
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
 
请提供关于这些信息的反馈
这些信息帮助解决问题了吗?
我不知道
这些信息和问题是相关的吗?
您认为我们怎样才能提高这些信息的质量呢?
为了保护您的隐私,请不要在您的反馈中提及联系信息。

文章翻译

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值