能力值:
(RANK:10 )
3 楼
源码如下,不知道哪里有错误?
// rr.h: Definition of the rr class
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_RR_H__974B3E4B_B3D9_4D88_8143_D287E29CEC2A__INCLUDED_)
#define AFX_RR_H__974B3E4B_B3D9_4D88_8143_D287E29CEC2A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "shlobj.h"
#include "comdef.h"
#include "resource.h" // main symbols
/////////////////////////////////////////////////////////////////////////////
// rr
class rr :
public IDispatchImpl<Irr, &IID_Irr, &LIBID_EELib>,
public CComObjectRoot,
public CComCoClass<rr,&CLSID_rr>,
public IShellExtInit,
public IContextMenu
{
BEGIN_COM_MAP(rr)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(Irr)
COM_INTERFACE_ENTRY(IShellExtInit)
COM_INTERFACE_ENTRY(IContextMenu)
END_COM_MAP()
//DECLARE_NOT_AGGREGATABLE(rr)
// Remove the comment from the line above if you don't want your object to
// support aggregation.
DECLARE_REGISTRY_RESOURCEID(IDR_rr)
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
// Irr
public:
// IShellExtInit
STDMETHOD(Initialize)(LPCITEMIDLIST, LPDATAOBJECT, HKEY);
// IContextMen
STDMETHOD(GetCommandString)(UINT, UINT, UINT*, LPSTR, UINT);
STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO);
STDMETHOD(QueryContextMenu)(HMENU, UINT, UINT, UINT, UINT);
};
#endif // !defined(AFX_RR_H__974B3E4B_B3D9_4D88_8143_D287E29CEC2A__INCLUDED_) // rr.cpp : Implementation of CEeApp and DLL registration.
#include "stdafx.h"
#include "ee.h"
#include "rr.h"
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP rr::InterfaceSupportsErrorInfo(REFIID riid)
{
return S_OK;
}
HRESULT rr::Initialize ( LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID )
{
{FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stg = { TYMED_HGLOBAL };
HDROP hDrop;
TCHAR szFile [MAX_PATH];
int nNumFiles;
// 在数据对象内查找 CF_HDROP 型数据.
if ( FAILED( pDataObj->GetData ( &fmt, &stg )))
{
// Nope! Return an "invalid argument" error back to Explorer.
return E_INVALIDARG;
}
// 获得指向实际数据的指针
hDrop = (HDROP) GlobalLock ( stg.hGlobal );
// 检查非NULL.
if ( NULL == hDrop )
{
return E_INVALIDARG;
}
// 检查在该操作中有几个文件被选择.
nNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 );
if(0 == nNumFiles)
{
GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return E_INVALIDARG;
}
/*// 有效性检查 – 保证最少有一个文件名.
UINT uNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 );
if ( 0 == uNumFiles )
{
GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return E_INVALIDARG;
} */
for ( int uFile = 0; uFile < nNumFiles; uFile++ )
{
//取得下一个文件名.
if ( 0 == DragQueryFile ( hDrop,
uFile, szFile, MAX_PATH ))
continue;
//m_lsFiles.AddTail(szFile);
//m_mapInt2StrFiles[uFile] = szFile;
} // end for
GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return S_OK ;
}
}
HRESULT rr::QueryContextMenu ( HMENU hmenu,UINT uMenuIndex, UINT uidFirstCmd, UINT uidLastCmd, UINT uFlags )
{
UINT uCmdID = uidFirstCmd;
char *szMenuText_Popup = "自定义菜单";
char *szMenuText_1 = "自定义菜单1...";
char *szMenuText_2 = "自定义菜单2...";
char *szMenuText_3 = "自定义菜单3...";
char *szMenuText_4 = "自定义菜单4...";
// 如果标志包含 CMF_DEFAULTONLY 我们不作任何事情.
if ( uFlags & CMF_DEFAULTONLY )
{
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 0 );
}
if ( uFlags & CMF_VERBSONLY )
{
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 0 );
}
//InsertMenu(hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);
uMenuIndex++;
HMENU hSubMenu = CreateMenu();
struct HBITMAP__ * m_hRegBmp=0;
if(hSubMenu)
{
InsertMenu(hSubMenu, 0, MF_STRING | MF_BYPOSITION, uCmdID++, "111");
SetMenuItemBitmaps(hSubMenu, 0, MF_BYPOSITION, m_hRegBmp, m_hRegBmp);
InsertMenu(hSubMenu, 1, MF_STRING | MF_BYPOSITION, uCmdID++, "222");
SetMenuItemBitmaps(hSubMenu, 1, MF_BYPOSITION, m_hRegBmp, m_hRegBmp);
//InsertMenu(hSubMenu, 2, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);
InsertMenu(hSubMenu, 2, MF_STRING | MF_BYPOSITION, uCmdID++, "333");
SetMenuItemBitmaps(hSubMenu, 2, MF_BYPOSITION, m_hRegBmp, m_hRegBmp);
InsertMenu(hSubMenu, 3, MF_STRING | MF_BYPOSITION, uCmdID++, "444");
SetMenuItemBitmaps(hSubMenu, 3, MF_BYPOSITION, m_hRegBmp, m_hRegBmp);
}
InsertMenu(hmenu, uMenuIndex, MF_STRING | MF_POPUP | MF_BYPOSITION, (UINT_PTR)hSubMenu, "555");
//uMenuIndex++;
//InsertMenu(hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);
//uMenuIndex++;
//最后告诉浏览器我们添加了几个菜单项
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 4 );
}
HRESULT rr::GetCommandString(UINT a, UINT b, UINT * cc, LPSTR d, UINT e)
{return S_OK;}
HRESULT rr::InvokeCommand(LPCMINVOKECOMMANDINFO tt)
{MessageBox(0,"12345","12345",0);
return S_OK;}