⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gxmenu.cpp

📁 Windows资源浏览器外壳扩展右键菜单功能的实例程序
💻 CPP
字号:
// gxMenu.cpp : Implementation of CgxMenu
#include "stdafx.h"
#include "MenuDemo.h"
#include "gxMenu.h"


HINSTANCE   g_hInst;
UINT        g_DllRefCount;
int         g_nColumn1;
int         g_nColumn2;
BOOL        g_bViewKeys;
BOOL        g_bShowIDW;
HIMAGELIST  g_himlLarge;
HIMAGELIST  g_himlSmall;

/////////////////////////////////////////////////////////////////////////////
// CgxMenu

HRESULT CgxMenu::QueryContextMenu(HMENU hmenu, UINT indexMenu,
								   UINT idCmdFirst, UINT idCmdLast,
								   UINT uFlags)
{

	if (!(CMF_DEFAULTONLY & uFlags))
	{
		int nCmdRegister = idCmdFirst;
		int nCmdUnregister = idCmdFirst+1;

		InsertMenu(hmenu, indexMenu++, MF_SEPARATOR,
					nCmdRegister, _T("-"));

		InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION,
					nCmdRegister+1, _T("文档上传"));
		InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION,
					nCmdRegister+2, _T("文档下载"));
		InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION,
					nCmdRegister+3, _T("文档打印"));

		InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION|MF_POPUP,
					nCmdRegister+4, _T("安全文档管理"));
		HMENU subMenu = CreateMenu() ; 

		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+5, _T("发送到个人"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+6, _T("发送到群组"));
		InsertMenu(subMenu, (UINT)hmenu, MF_SEPARATOR,
					nCmdRegister+7, _T("-"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+8, _T("查看消息中心"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+9, _T("服务器浏览"));
		InsertMenu(subMenu, (UINT)hmenu, MF_SEPARATOR,
					nCmdRegister+10, _T("-"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+11, _T("打印审核"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+12, _T("文档秘级审核"));
		InsertMenu(subMenu, (UINT)hmenu, MF_SEPARATOR,
					nCmdRegister+13, _T("-"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+14, _T("文件收发统计"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+15, _T("邮件收发"));
		InsertMenu(subMenu, (UINT)hmenu, MF_SEPARATOR,
					nCmdRegister+16, _T("-"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+17, _T("帮助"));
		InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
					nCmdRegister+18, _T("关于"));



		MENUITEMINFO ItemInfo; 

		memset( &ItemInfo, 0 ,sizeof(ItemInfo)) ;
		ItemInfo.cbSize = sizeof(ItemInfo) ;
		ItemInfo.hSubMenu = subMenu ; 
		ItemInfo.fMask = MIIM_SUBMENU  ;
		SetMenuItemInfo(hmenu,nCmdRegister+4,FALSE,&ItemInfo) ;
		DestroyMenu(subMenu) ;
		// A successful return code should be the offset of
		// the largest command identifier assigned, plus one
		return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 19);
	}
	
	return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, USHORT(0));
}

HRESULT CgxMenu::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
{
	TCHAR szParms[MAX_PATH+6];

	// The offset will determine which option was requested:
	// 0 for Register, 1 for Unregister
	UINT idOffset = LOWORD(pici->lpVerb);

	// Embed a '/u' for the Unregister command into the
	// parameters, and always put quotes around the path
	// so spaces in the path won't be a problem
	char Tmp[1024] ; 
	memset(Tmp,0,sizeof(Tmp)) ; 
//	strcpy(Tmp, "c:\\filelist.txt") ;
	sprintf( Tmp , " %d " , idOffset ) ;	

	switch(idOffset)
	{
	case 1:
//		AfxMessageBox("文件上传") ;
//		Sleep(5000) ;
		ShellExecute( pici->hwnd, "open", _T("c:\\vbtest.exe"), Tmp,NULL,SW_SHOW);
		break ; 
	case 2:
		//		AfxMessageBox("文件下载") ;
		ShellExecute( pici->hwnd, "open", _T("c:\\vbtest.exe"), Tmp,NULL,SW_SHOW);
		break ; 
	case 3:
		//		AfxMessageBox("打印") ;
		ShellExecute( pici->hwnd, "open", _T("c:\\vbtest.exe"), Tmp,NULL,SW_SHOW);
		break ; 
	case 5:
		AfxMessageBox("发送到个人") ;
		break ; 
	case 6:
		AfxMessageBox("发送到群组") ;
		break ; 
	case 7:
		AfxMessageBox("") ;
		break ; 
	case 8:
		AfxMessageBox("查看消息中心") ;
		break ; 
	case 9:
		AfxMessageBox("服务器浏览") ;
		break ; 
	case 10:
		AfxMessageBox("") ;
		break ; 
	case 11:
		AfxMessageBox("打印审核") ;
		break ; 
	case 12:
		AfxMessageBox("文档秘级审核") ;
		break ; 
	case 13:
		AfxMessageBox("-") ;
		break ; 
	case 14:
		AfxMessageBox("文件收发统计") ;
		break ; 
	case 15:
		AfxMessageBox("邮件收发") ;
		break ; 
	case 16:
		AfxMessageBox("-") ;
		break ; 
	case 17:
		AfxMessageBox("帮助") ;
		break ; 
	case 18:
		AfxMessageBox("关于") ;
		break ; 
	
	}


	return S_OK;
}

HRESULT CgxMenu::GetCommandString(UINT idCmd, UINT uFlags, UINT* pwReserved,
								   LPSTR pszName, UINT cchMax)
{
	if (uFlags & GCS_HELPTEXT)
	{
		// Windows NT will ask for Unicode strings
		switch(idCmd)
		{
		case 0:
			if (uFlags & GCS_VERBA)
				lstrcpyn(pszName, "Perform COM registration for this module", cchMax);
			else
				lstrcpynW((LPWSTR)pszName, L"Perform COM registration for this module", cchMax);
			break;
		case 1:
			if (uFlags & GCS_VERBA)
				lstrcpyn(pszName, "Perform COM unregistration for this module", cchMax);
			else
				lstrcpynW((LPWSTR)pszName, L"Perform COM unregistration for this module", cchMax);
			break;
		default:
			break;
		}

		return S_OK;
	}

	return E_FAIL;
}


HRESULT CgxMenu::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT lpdobj, HKEY hkeyProgID)
{
	if (lpdobj == NULL)
		return E_INVALIDARG;

	// The file can be referenced through the STGMEDIUM structure
	// that is retrievable through the IDataObject pointer, and
	// DragQueryFile can then be used to retrieve the file name.

	//数据存储格式
	FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
	
	//数据存储内存句柄(常用于IDataObject和IAdviseSink接口的数据传输操作)
	STGMEDIUM stg = { TYMED_HGLOBAL };
	
	if(FAILED(lpdobj->GetData(&fmt, &stg)))
	{
		//如果获取数据内存句柄失败则返回E_INVALIDARG,
		//返回E_INVALIDARG则Explorer不会再调用我们的Shell扩展接口
		return E_INVALIDARG;
	}
	
	//获取实际数据内存句柄
	HDROP hDrop = (HDROP)GlobalLock(stg.hGlobal);
	if(NULL==hDrop)
	{
		//在COM程序中养成良好的检错习惯是很重要的!!!
		return E_INVALIDARG;
	}
	//获取用户Drag/Drop的文件数目
	int nDropCount = ::DragQueryFile((HDROP)stg.hGlobal, 
		0xFFFFFFFF, NULL, 0);
	
	//本示例程序仅获取第一个Drag/Drop文件完整路径
	//以下注释代码为获取所有文件完整路径的实现代码:
	char m_pzDropFile[MAX_PATH];
	m_FileCount = nDropCount ; 
	if( m_FileList!=NULL) 
		delete []m_FileList ; 
	m_FileList = new TCHAR[m_FileCount * MAX_PATH] ; 
	memset(m_FileList,0,m_FileCount * MAX_PATH) ;
	TCHAR  * p = m_FileList ; 
	FILE * fp = fopen("c:\\Filelist.txt","wb") ; 


	for(int i = 0; i < nDropCount; ++i)
	{
	//循环获取每个Drag/Drop文件的完整文件名
		memset(m_pzDropFile,0,sizeof(m_pzDropFile)) ;
		::DragQueryFile((HDROP)stg.hGlobal, i, m_pzDropFile, MAX_PATH);
		strcpy(p,m_pzDropFile) ;
		p+=MAX_PATH ;
		char Tmp[1024] ; 
		memset(Tmp , 0,sizeof(Tmp)) ; 
		strcpy(Tmp , m_pzDropFile) ; 
		strcat(Tmp , "\r\n") ; 
		fputs( Tmp,fp)  ; 
	}
	
	fclose(fp) ;
	//如果用户Drag/Drop的文件数目不为一个则不予处理
	if(1==nDropCount)
	{
		//pzDropFile为组件类内部的private变量
		//它用来保存用户Drag/Drop的文件完整文件名
		memset(m_pzDropFile, 0x0, MAX_PATH*sizeof(TCHAR));
		::DragQueryFile((HDROP)stg.hGlobal, 0, m_pzDropFile, MAX_PATH);
	}
	
	//释放内存句柄
	::ReleaseStgMedium(&stg);
	return S_OK; 
}

  
CgxMenu::CgxMenu()
{
	m_FileList = NULL ;
}

CgxMenu::~CgxMenu()
{
	if(NULL == m_FileList) 
	{
		delete []m_FileList ; 
		m_FileList = NULL ;
	}
}
typedef int (*CHICK_IN)(char * ) ; 
int CgxMenu::FileCheckIn()
{
	HMODULE hModule = ::LoadLibrary( "E:\\vcpro\\vbdll\\TestDLL.dll") ; 
	if( NULL == hModule ) 
		return 0 ; 
	CHICK_IN ChickFn = (CHICK_IN) ::GetProcAddress(hModule, "check_in") ; 
	if( ChickFn== NULL ) 
		return 0 ;

	ChickFn(m_FileList) ;
	::FreeLibrary(hModule) ; 
return 0 ; 
}
HRESULT CgxMenu::DragEnter(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
{
	
	AfxMessageBox("Enter") ;
	
	return S_OK ;
}
HRESULT CgxMenu::DragOver(DWORD grfKeyState,POINTL pt,DWORD* pdwEffect)
{
	AfxMessageBox("DragOver") ;
	
	return S_OK;
} 
HRESULT CgxMenu::DragLeave()
{
	AfxMessageBox("DragLeave") ;
	return S_OK ;
}
HRESULT CgxMenu::Drop(IDataObject* pDataObj,DWORD grfKeyState,POINTL pt,DWORD* pdwEffect)
{
	AfxMessageBox("Drop") ;
return S_OK ;

}



STDMETHODIMP CgxMenu::BindToObject(  LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
{
	*ppvOut = NULL;

	return S_OK;
}
STDMETHODIMP CgxMenu::BindToStorage( LPCITEMIDLIST pidl,  LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
{
	*ppvOut = NULL;
	return E_NOTIMPL;
}

STDMETHODIMP CgxMenu::EnumObjects(   HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
{
	HRESULT  hr;
	
	return S_OK;
}

STDMETHODIMP CgxMenu::GetAttributesOf(  UINT uCount, LPCITEMIDLIST aPidls[], LPDWORD pdwAttribs)
{
	return S_OK;
}

STDMETHODIMP CgxMenu::GetUIObjectOf( HWND hwndOwner,  UINT uCount,  LPCITEMIDLIST *pPidl,  REFIID riid,  LPUINT puReserved,  LPVOID *ppvReturn)
{
	*ppvReturn = NULL;
	
	return E_NOINTERFACE;
}

STDMETHODIMP CgxMenu::GetDisplayNameOf( LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET lpName)
{
	return S_OK;
}

STDMETHODIMP CgxMenu::ParseDisplayName( HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpDisplayName, LPDWORD pdwEaten, LPITEMIDLIST *pPidlNew, LPDWORD pdwAttributes)
{
	return S_OK;
}

STDMETHODIMP CgxMenu::SetNameOf(  HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dw,  LPITEMIDLIST *pPidlOut)
{
	return S_OK;
}

STDMETHODIMP CgxMenu::CreateViewObject( HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
{

	return S_OK;
}
STDMETHODIMP CgxMenu::CompareIDs( LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
	return S_OK ;
}

STDMETHODIMP CgxMenu::Initialize(LPCITEMIDLIST pidl)
{
	if(m_pidlNSRoot)
	{
		m_pPidlMgr->Delete(m_pidlNSRoot);
		m_pidlNSRoot = NULL;
	}

	m_pidlNSRoot = m_pPidlMgr->Copy(pidl);
	return S_OK;
}
STDMETHODIMP CgxMenu::GetClassID(LPCLSID )
{
	return S_OK ; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -