'IContextMenu' : no GUID has been associated with this object

[問題描述]

VS2008編譯windows shell,成功;相同的方法在VS2005和vs2003下,提示錯誤:

error C2787: 'IContextMenu' : no GUID has been associated with this object

error C2440: 'initializing' : cannot convert from 'DWORD_PTR' to 'const IID *'

error C2440: 'initializing' : cannot convert from 'ATL::_ATL_CREATORARGFUNC (__stdcall *)' to 'DWORD_PTR'

[解決方法]

關鍵的問題是以下頭文件沒有包含正確

#include "shlobj.h"

#include "comdef.h"

#include <shlguid.h>

下面是收集的一些問題解決過程:

1Have you downloaded the Latest Platfrom SDK? If so, are your vc dirs pointing to the proper include dirs, eg: shlguid.h is getting picked up from the SDK\include and not the vc98\include. You set those in the tools-Options->directories->include dirs for VC

2There are two <comdef.h> header files in VC.NET, one in Vc7/include and the other in Vc7/PlatformSDK/include. The former splits off the smart pointer typedefs into comdefsp.h, and it doesn't include IContextMenu. The latter does. You can try to #include the PlatformSDK header directly, change your INCLUDE path order, or supply the missing typedef yourself, e.g.

struct __declspec(uuid("000214e4-0000-0000-c000-000000000046"))

IContextMenu;

_COM_SMARTPTR_TYPEDEF(IContextMenu, __uuidof(IContextMenu));

3、怎樣找到InterfaceGUID?

我在註冊表 HKCR\Interface\ 下可以找到形式爲

{aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}的鍵,如果其下有默認項="Interface",則說明這個鍵就是該InterfaceGUID

有沒有其它方法?

(1) VC6\common\Tools 下有個OLE/COM Object Viewer 很方便,但在VC2005下就沒找到這個工具

(2) PlatformSDK\include\comdef.h 中也有GUID的定義

4__uuidof它是C++ 運算符

如上所述,如果把PlatformSDK/include放在前面仍然不可以的話,就下載新的SDK,把include目錄包含進去就好了。個人感覺手動添加這些uuid值如,struct __declspec(uuid("000214e4-0000-0000-c000-000000000046"))

IContextMenu;

_COM_SMARTPTR_TYPEDEF(IContextMenu, __uuidof(IContextMenu));

總結:

我採用的是將vc71/PlatformSDK/include放在前面放到vc71/include的前面解決的

發佈了42 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章