急公司季度考试,桌面右键菜单实现,点击就是不动作,怎么处理
急啊,公司季度考试,桌面右键菜单实现,点击就是不动作,怎么办!
实在不会,这能现学,比着别人的修改的,原文:http://www.cppblog.com/shly/archive/2013/10/07/157894.html
到底哪里出错了,在桌面右键后,然后点击添加的“我是显卡选项” 就是没反应啊!
现在:
#pragma once
#include "resource.h" // 主符号
#include "CtxMenuExt.h"
#include "shlobj.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif
#define SZ_MENUTEXT TEXT("我是显卡")
extern HINSTANCE _hInstance;
// CCContextMenuExt
class ATL_NO_VTABLE CCContextMenuExt :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CCContextMenuExt, &CLSID_CContextMenuExt>,
public IDispatchImpl<ICContextMenuExt, &IID_ICContextMenuExt, &LIBID_CtxMenuExtLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IShellExtInit,
public IContextMenu
{
public:
CCContextMenuExt()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_CCONTEXTMENUEXT)
BEGIN_COM_MAP(CCContextMenuExt)
COM_INTERFACE_ENTRY(ICContextMenuExt)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IShellExtInit)
COM_INTERFACE_ENTRY(IContextMenu)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
m_hBitmap = LoadBitmap(_hInstance, MAKEINTRESOURCE(IDB_MENU));
return S_OK;
}
void FinalRelease()
{
if (m_hBitmap)
{
DeleteObject(m_hBitmap);
}
}
public:
enum
{
IDM_CTXMENU = 0,
};
public:
HRESULT STDMETHODCALLTYPE Initialize(
/* [in] */ LPCITEMIDLIST pidlFolder,
/* [in] */ IDataObject *pdtobj,
/* [in] */ HKEY hkeyProgID)
{
FORMATETC fmt =
{
CF_HDROP,
NULL,
DVASPECT_CONTENT,
-1,
TYMED_HGLOBAL
};
STGMEDIUM sm =
{
TYMED_HGLOBAL
};
return S_OK;
}
STDMETHOD(QueryContextMenu)(THIS_
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags)
{
MENUITEMINFO mii;
if (uFlags & CMF_DEFAULTONLY)
{
return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0);
}
memset((void*)&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STRING | MIIM_CHECKMARKS | MIIM_ID | MIIM_STATE;
mii.cch = lstrlen(SZ_MENUTEXT);
mii.dwTypeData = SZ_MENUTEXT;
/*
这里用hbmpChecked而不用hbmpItem的原因
实在不会,这能现学,比着别人的修改的,原文:http://www.cppblog.com/shly/archive/2013/10/07/157894.html
到底哪里出错了,在桌面右键后,然后点击添加的“我是显卡选项” 就是没反应啊!
现在:
#pragma once
#include "resource.h" // 主符号
#include "CtxMenuExt.h"
#include "shlobj.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif
#define SZ_MENUTEXT TEXT("我是显卡")
extern HINSTANCE _hInstance;
// CCContextMenuExt
class ATL_NO_VTABLE CCContextMenuExt :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CCContextMenuExt, &CLSID_CContextMenuExt>,
public IDispatchImpl<ICContextMenuExt, &IID_ICContextMenuExt, &LIBID_CtxMenuExtLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IShellExtInit,
public IContextMenu
{
public:
CCContextMenuExt()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_CCONTEXTMENUEXT)
BEGIN_COM_MAP(CCContextMenuExt)
COM_INTERFACE_ENTRY(ICContextMenuExt)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IShellExtInit)
COM_INTERFACE_ENTRY(IContextMenu)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
m_hBitmap = LoadBitmap(_hInstance, MAKEINTRESOURCE(IDB_MENU));
return S_OK;
}
void FinalRelease()
{
if (m_hBitmap)
{
DeleteObject(m_hBitmap);
}
}
public:
enum
{
IDM_CTXMENU = 0,
};
public:
HRESULT STDMETHODCALLTYPE Initialize(
/* [in] */ LPCITEMIDLIST pidlFolder,
/* [in] */ IDataObject *pdtobj,
/* [in] */ HKEY hkeyProgID)
{
FORMATETC fmt =
{
CF_HDROP,
NULL,
DVASPECT_CONTENT,
-1,
TYMED_HGLOBAL
};
STGMEDIUM sm =
{
TYMED_HGLOBAL
};
return S_OK;
}
STDMETHOD(QueryContextMenu)(THIS_
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags)
{
MENUITEMINFO mii;
if (uFlags & CMF_DEFAULTONLY)
{
return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0);
}
memset((void*)&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STRING | MIIM_CHECKMARKS | MIIM_ID | MIIM_STATE;
mii.cch = lstrlen(SZ_MENUTEXT);
mii.dwTypeData = SZ_MENUTEXT;
/*
这里用hbmpChecked而不用hbmpItem的原因