急啊,公司季度考试,桌面右键菜单实现,点击就是不动作,怎么办!

大鸭子男孩 2013-10-28 05:14:28
实在不会,这能现学,比着别人的修改的,原文: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的原因
- -自己动手试试就知道了。
*/
mii.hbmpItem;
mii.hbmpChecked = m_hBitmap;
mii.hbmpUnchecked = m_hBitmap;
mii.fState = MFS_ENABLED;
mii.wID = idCmdFirst + indexMenu;

if (!InsertMenuItem(hmenu, 0, TRUE, &mii))
{
return E_FAIL;
}

lstrcpynA(m_pszVerb, "protected_run", 32);
lstrcpynW(m_pwszVerb, L"protected_run", 32);

return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, IDM_CTXMENU + 1);
}

STDMETHOD(InvokeCommand)(THIS_
LPCMINVOKECOMMANDINFO lpici)
{
MessageBox(NULL,TEXT("我就是显卡啊!"),TEXT(""),MB_OK);
return S_OK;


}

STDMETHOD(GetCommandString)(THIS_
UINT_PTR idCmd,
UINT uType,
UINT * pwReserved,
LPSTR pszName,
UINT cchMax)
{
return S_OK;
}

private:
TCHAR m_pszFileName[MAX_PATH];
HBITMAP m_hBitmap;
CHAR m_pszVerb[32];
WCHAR m_pwszVerb[32];

};

OBJECT_ENTRY_AUTO(__uuidof(CContextMenuExt), CCContextMenuExt)
...全文
286 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
riderlg 2013-11-04
  • 打赏
  • 举报
回复
加了点注释,代码扣给你研究下
HRESULT CUploadMenuExt::QueryContextMenu (HMENU hmenu, 
                                      UINT uMenuIndex, 
                                      UINT uidFirstCmd,
                                      UINT uidLastCmd, 
                                      UINT uFlags )
{

	if (uFlags & CMF_DEFAULTONLY)
	{
		return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0);
	}
	
	UINT uCmdID = uidFirstCmd;
	//添加横线
	InsertMenu (hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);
	uMenuIndex++;

	HMENU hSubMenu = CreateMenu();
	//添加子菜单
	if(hSubMenu)
	{	
		InsertMenu (hSubMenu, 0, MF_BYPOSITION, uCmdID++, _T("上传至个人目录"));
		SetMenuItemBitmaps(hSubMenu, 0, MF_BYPOSITION, m_hBitmapUpLoad, m_hBitmapUpLoad);
	}
	//添加菜单项
	InsertMenu (hmenu, uMenuIndex, MF_STRING | MF_POPUP | MF_BYPOSITION,
		(UINT_PTR)hSubMenu, _T("安全小助手"));
	SetMenuItemBitmaps(hmenu, uMenuIndex, MF_BYPOSITION, m_hBitmapMenu, m_hBitmapMenu);
	uMenuIndex++;
	
	//添加横线
	InsertMenu(hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);
	 uMenuIndex++;

	return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 1  );

}


//处理菜单响应
HRESULT CUploadMenuExt::InvokeCommand (LPCMINVOKECOMMANDINFO pCmdInfo )
{	
	if (0!=HIWORD(pCmdInfo->lpVerb))
		return E_INVALIDARG;

	switch (LOWORD(pCmdInfo->lpVerb))
	{
	case 0:
 		if(!m_Recorder.IsEmailHelperLogin())
 		{
 			MessageBox(NULL,_T("请先登录安全小助手"), _T("警告"),MB_OK);
			CString AppPath = m_Recorder.GetAppPath()+"/安全小助手.exe";
			ShellExecute(NULL, "open", AppPath, NULL, NULL, SW_SHOW);
 			return S_OK;
 		}
		OnMenuOpenEm();
		break;

	default:
		return E_INVALIDARG;
	
	}
	return S_OK;
}
大鸭子男孩 2013-10-30
  • 打赏
  • 举报
回复
谢谢你们 ,最后还是找不到哪里错了,个人猜测是InsertMenuItem之后 return MAKE_HRESULT的值有问题,改用InsertMenu了
buyong 2013-10-30
  • 打赏
  • 举报
回复
你们公司是学校么?还季度考试??
riderlg 2013-10-29
  • 打赏
  • 举报
回复
lz遇到的这个问题我前几个月也见过,但是最后通过多方面的尝试,发现是32位和64位系统的问题,如果你的电脑是64位系统请尝试编译64位dll来注册,希望能帮到你.
max_min_ 2013-10-28
  • 打赏
  • 举报
回复
单步跟踪看看!确定你点击“我是显卡选项”的时候,是否得到相关协议的第一步相应! 并通过此协议是否成功调用相关接口函数!

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧