?? getname.cpp
字號:
//
#include "stdafx.h"
#include "CopyName.h"
#include "GetName.h"
#include "RegisterClass.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGetName
BOOL AFXAPI CopyStringToClipboard(LPCTSTR szStr);
IMPLEMENT_DYNCREATE(CGetName, CCmdTarget)
CGetName::CGetName()
{
EnableAutomation();
AfxOleLockApp();
}
CGetName::~CGetName()
{
AfxOleUnlockApp();
}
void CGetName::OnFinalRelease()
{
// CCmdTarget::OnFinalRelease();
delete this;
}
BEGIN_MESSAGE_MAP(CGetName, CCmdTarget)
//{{AFX_MSG_MAP(CGetName)
//
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CGetName, CCmdTarget)
//{{AFX_DISPATCH_MAP(CGetName)
//
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
// {7ABA2FEC-05A0-11D2-8446-00A02491B6C9}
static const IID IID_IGetName =
{ 0x7aba2fec, 0x5a0, 0x11d2, { 0x84, 0x46, 0x0, 0xa0, 0x24, 0x91, 0xb6, 0xc9 } };
BEGIN_INTERFACE_MAP(CGetName, CCmdTarget)
INTERFACE_PART(CGetName, IID_IGetName, Dispatch)
INTERFACE_PART(CGetName, IID_IContextMenu, MenuExt)
INTERFACE_PART(CGetName, IID_IShellExtInit, ShellInit)
END_INTERFACE_MAP()
// {7ABA2FED-05A0-11D2-8446-00A02491B6C9}
//IMPLEMENT_OLECREATE(CGetName, "CopyName.GetName", 0x7aba2fed, 0x5a0, 0x11d2, 0x84, 0x46, 0x0, 0xa0, 0x24, 0x91, 0xb6, 0xc9)
/////////////////////////////////////////////////////////////////////////////
// CGetName method Handle
IMPLEMENT_OLECREATE_EX(CGetName, "CopyFileName", 0x7aba2fed, 0x5a0, 0x11d2, 0x84, 0x46, 0x0, 0xa0, 0x24, 0x91, 0xb6, 0xc9)
STDMETHODIMP CGetName::XMenuExt::QueryInterface(REFIID riid, void** ppv)
{
METHOD_PROLOGUE(CGetName, MenuExt);
TRACE("CGetName::XMenuExt::QueryInterface\n");
return pThis->ExternalQueryInterface(&riid, ppv);
}
STDMETHODIMP_(ULONG) CGetName::XMenuExt::AddRef(void)
{
METHOD_PROLOGUE(CGetName, MenuExt);
return pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CGetName::XMenuExt::Release(void)
{
METHOD_PROLOGUE(CGetName, MenuExt);
return pThis->ExternalRelease();
}
STDMETHODIMP CGetName::XMenuExt::QueryContextMenu( HMENU hmenu,UINT indexMenu,
UINT idCmdFirst, UINT idCmdLast,UINT uFlags)
{
::InsertMenu(hmenu, indexMenu++, MF_STRING | MF_BYPOSITION,
idCmdFirst + ID_NEWCMD, "Copy FileName");
return ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_NULL, (USHORT)2));
}
STDMETHODIMP CGetName::XMenuExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
{
METHOD_PROLOGUE(CGetName, MenuExt);
// char szTest[MAX_PATH * 2];
if (HIWORD(lpici->lpVerb ))
{
AfxMessageBox("E_FAIL");
return E_FAIL;
}
if (LOWORD(lpici->lpVerb) > ID_NEWCMD)
{
AfxMessageBox("Invalid Arg");
return E_INVALIDARG;
}
if (LOWORD(lpici->lpVerb) == ID_NEWCMD)
{
CopyStringToClipboard(pThis->m_szFileName);
// wsprintf(szTest, "Context menu for file: %s", pThis->m_szFileName);
// ::MessageBox(lpici->hwnd, szTest, "Context Menu Handler", MB_OK);
}
else
::MessageBox(lpici->hwnd, "ID != ID_NEWCMD", "Context Menu Handler", MB_OK);
return NOERROR;
}
STDMETHODIMP CGetName::XMenuExt::GetCommandString(UINT idCmd,UINT uType,
UINT* pwReserved,LPSTR pszName,UINT cchMax)
{
if (idCmd > ID_NEWCMD)
return ResultFromScode(E_INVALIDARG);
if (idCmd == ID_NEWCMD)
lstrcpy(pszName, "Context Menu Test");
return NOERROR;
}
// IUnknown for IShellExtInit
STDMETHODIMP CGetName::XShellInit::QueryInterface(REFIID riid, void** ppv)
{
METHOD_PROLOGUE(CGetName, ShellInit);
TRACE("CGetName::XShellInit::QueryInterface\n");
return pThis->ExternalQueryInterface(&riid, ppv);
}
STDMETHODIMP_(ULONG) CGetName::XShellInit::AddRef(void)
{
METHOD_PROLOGUE(CGetName, ShellInit);
return pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CGetName::XShellInit::Release(void)
{
METHOD_PROLOGUE(CGetName, ShellInit);
return pThis->ExternalRelease();
}
STDMETHODIMP CGetName::XShellInit::Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdobj, HKEY hkeyProgID)
{
METHOD_PROLOGUE(CGetName, ShellInit);
TRACE("CGetName::XShellInit::Intialize\n");
HRESULT hres = E_FAIL;
FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM medium;
//
// no data object, we dont deal with that.
//
if (pdobj == NULL)
{
TRACE("CGetName::XShellInit::Initialize() no data object");
return E_FAIL;
}
//
// use the given IDataObject to get a list of filenames (CF_HDROP)
//
hres = pdobj->GetData(&fmte, &medium);
if (FAILED(hres))
{
TRACE("CGetName::XShellInit::Initialize() cant get data");
return E_FAIL;
}
//
// a HDROP can contain more than one file if the user selects
// multiple files and brings up a context menu your handler
// will be called. not all files will be your type! only the
// first one will be. unless your handler can deal with
// any file type, the best thing to do is to not
// support HDROPs with more than one file.
//
if (DragQueryFile((HDROP)medium.hGlobal, (UINT)-1, NULL, 0) == 1)
{
DragQueryFile((HDROP)medium.hGlobal, 0, pThis->m_szFileName, sizeof(pThis->m_szFileName));
hres = S_OK;
}
else
hres = E_FAIL;
//
// release the data.
//
ReleaseStgMedium(&medium);
return hres;
}
/*
BOOL CGetName::CGetNameFactory::UpdateRegistry(BOOL bRegister)
{
return TRUE;
}
*/
BOOL CGetName::CGetNameFactory::UpdateRegistry(BOOL bRegister)
{
//REFCLSID
CRegisterClass reg(m_clsid,"CopyFileName");
VERIFY(reg.AddSymbolAlias("*","*") == 3);
VERIFY(reg.AddSymbolAlias("Directory","Directory") == 4);
reg.AddEntry("CLSID\\%1\\InProcServer32","Apartment","ThreadingModel");
reg.AddEntry("%4\\shellex\\ContextMenuHandlers\\%2","%1");
reg.AddEntry("%5\\shellex\\ContextMenuHandlers\\%2","%1");
if(bRegister)
{
COleObjectFactory::UpdateRegistry(TRUE);
return reg.Register();
}
else
{
reg.Register(FALSE);
#ifdef _AFXDLL
return AfxOleUnregisterClass(m_clsid,NULL);
#else
reg.RemoveKey("CLSID\\%1");
reg.RemoveKey("%2");
return TRUE;
#endif
}
}
BOOL AFXAPI CopyStringToClipboard(LPCTSTR szStr)
{
HGLOBAL hData;
LPVOID lpData;
CString szTemp;
LPSTR sz;
long nSize;
szTemp = szStr;
nSize = szTemp.GetLength()+1;
sz = szTemp.LockBuffer();
hData = GlobalAlloc(GHND,nSize);
if(hData == NULL ||
(lpData = GlobalLock(hData)) ==NULL )
{
GlobalFree(hData);
return FALSE;
}
lstrcpy((LPSTR)lpData,sz);
GlobalUnlock(hData);
szTemp.UnlockBuffer();
if(OpenClipboard(NULL))
{
EmptyClipboard();
SetClipboardData(CF_TEXT,hData);
CloseClipboard();
}
GlobalUnlock(hData);
GlobalFree(hData);
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -