程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> error C2787: IxxxxObject no GUID has been associated with

error C2787: IxxxxObject no GUID has been associated with

編輯:C++入門知識

error C2787: 'IxxxxObject'
no GUID has been associatedwith this object解決方法
 
1>error C2787: 'IInputObject' : no GUID has been associated withthis object
1>error C2440: 'initializing': cannot convert from 'DWORD_PTR' to 'const IID *'
1>error C2440: 'initializing': cannot convert from 'ATL::_ATL_CREATORARGFUNC (__stdcall*)' to 'DWORD_PTR'
 
之前把一個IE插件工程從VS2008轉換為VS2005工程時,出現了上述的問題,這種提示成組出現(C2440是常見錯誤但是這裡明顯是C2787錯誤連帶引發的),除了IInputObject這個接口還有其它的一些接口也會出現問題,經過觀察和查看源代碼,發現在VS2005的頭文件裡面類似這些接口在聲明時,沒有提供GUID的聲明,但是之前的一些很熟悉的接口則是有的,譬如IDispatch接口:
#if defined(__cplusplus)&& !defined(CINTERFACE)
  
    MIDL_INTERFACE("00020400-0000-0000-C000-000000000046")
IDispatch : publicIUnknown
 
而IInputObject的接口聲明則沒有了:
#undef  INTERFACE
#define INTERFACE   IInputObject
 
DECLARE_INTERFACE_(IInputObject, IUnknown)
{
 
因此就出現了上面錯誤說明裡面的對象沒有GUID關聯的情況,不過在VS2008裡面既然能編譯通過,說明兩邊的頭文件是不同的,事實也確實如此,在網上查了一些資料,基本上都是要求去下載新的頭文件,更新VS2005的頭文件,然後調整include的順序來解決[1]。實際上這個方法在一個大型的項目團隊(假設有上百人,使用的都是VS2005)裡面實行起來很麻煩,需要每個人都去安裝更新頭文件,修改VS2005的設置,因此只能再想其他辦法。
再看看引發錯誤的那句代碼:
COM_INTERFACE_ENTRY(IInputObject)
分析這個宏的實現,發現裡面有一句_ATL_IIDOF(x),正是這句的存在使得編譯出錯。
而在VS2005的頭文件裡面IID_IInputObject的定義是有的,因此可以想到使用COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)是不是就可以解決問題了?!
測試了一下編譯通過o(∩_∩)o 。
 
P.S.
COM_INTERFACE_ENTRY宏定義:
#define COM_INTERFACE_ENTRY(x)\
      {&_ATL_IIDOF(x),\
      offsetofclass(x,_ComMapClass), \
      _ATL_SIMPLEMAPENTRY},
COM_INTERFACE_ENTRY_IID宏定義:
#define COM_INTERFACE_ENTRY_IID(iid,x)\
      {&iid,\
      offsetofclass(x,_ComMapClass),\
      _ATL_SIMPLEMAPENTRY},
 
作者:magictong

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved