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

📄 shellext.cpp

📁 加密技术VC++
💻 CPP
字号:
// CCL.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "resource.h"
#include "priv.h"
#include "ShellExt.h"
#include "CtxMenu.h"

#include <shlobj.h>
#include <shlguid.h>

#include "ShUtils.h"

/*

	What follows is our implementation of the IClassFactory interface.
	This code is basically unmodified from the SHELLEX example.

*/

/***************************************************************
	Function:
	CShellExtClassFactory::CShellExtClassFactory()

	Purpose:
	constructor

	Param			Type			Use
	-----			----			---

	Returns
	-------

***************************************************************/
CShellExtClassFactory::CShellExtClassFactory()
{
    ODS("CShellExtClassFactory::CShellExtClassFactory()\r\n");

    m_cRef = 0L;

    g_cRefThisDll++;	
}

/***************************************************************
	Function:
	CShellExtClassFactory::~CShellExtClassFactory()	

	Purpose:
	destructor

	Param			Type			Use
	-----			----			---

	Returns
	-------

***************************************************************/																
CShellExtClassFactory::~CShellExtClassFactory()				
{
    g_cRefThisDll--;
}

/***************************************************************
	Function:
	STDMETHODIMP CShellExtClassFactory::QueryInterface(REFIID riid,
                                                   LPVOID FAR *ppv)

	Purpose:
	Return a ptr to an interface

	Param			Type			Use
	-----			----			---
	riid			REFIID			interface to get
	ppv				LPVOID *		ptr to rec our interface

	Returns
	-------
	NOERROR on successz

***************************************************************/
STDMETHODIMP CShellExtClassFactory::QueryInterface(REFIID riid,
                                                   LPVOID FAR *ppv)
{
    ODS("CShellExtClassFactory::QueryInterface()\r\n");

    *ppv = NULL;

    // Any interface on this object is the object pointer

    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
    {
        *ppv = (LPCLASSFACTORY)this;

        AddRef();

        return NOERROR;
    }

    return E_NOINTERFACE;
}	

/***************************************************************
	Function:
	STDMETHODIMP_(ULONG) CShellExtClassFactory::AddRef()

	Purpose:
	Increase our object's reference count

	Param			Type			Use
	-----			----			---

	Returns
	-------
	# of references

***************************************************************/
STDMETHODIMP_(ULONG) CShellExtClassFactory::AddRef()
{
    return ++m_cRef;
}

/***************************************************************
	Function:
	STDMETHODIMP_(ULONG) CShellExtClassFactory::Release()

	Purpose:
	Decrease our object's reference count

	Param			Type			Use
	-----			----			---

	Returns
	-------
	# of references

***************************************************************/

STDMETHODIMP_(ULONG) CShellExtClassFactory::Release()
{
    if (--m_cRef)
        return m_cRef;

    delete this;

    return 0L;
}

/***************************************************************
	Function:
	STDMETHODIMP CShellExtClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,
                                                      REFIID riid,
                                                      LPVOID *ppvObj)

	Purpose:
	Create an instace of a particular interface

	Param			Type			Use
	-----			----			---
	pUnkOuter		LPUNKNOWN		outer IUnknown
	riid			REFIID			interface ID
	ppvObj			LPVOID *		ptr to rec our interface
	Returns
	-------
	NOERROR on success

***************************************************************/
STDMETHODIMP CShellExtClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,
                                                      REFIID riid,
                                                      LPVOID *ppvObj)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

   ODS("CShellExtClassFactory::CreateInstance()\r\n");

   *ppvObj = NULL;

   // Shell extensions typically don't support aggregation (inheritance)

   if (pUnkOuter)
      return CLASS_E_NOAGGREGATION;

   // Create the main shell extension object.  The shell will then call
   // QueryInterface with IID_IShellExtInit--this is how shell extensions are
   // initialized.

   LPCSHELLEXT pShellExt;
   try {
      pShellExt = new CShellExt();  //Create the CShellExt object
   } 
   catch (CMemoryException *e) {
      e->Delete();
      pShellExt=NULL;
   }


   if (NULL == pShellExt)
      return E_OUTOFMEMORY;

   return pShellExt->QueryInterface(riid, ppvObj);
}

/***************************************************************
	Function:
	STDMETHODIMP CShellExtClassFactory::LockServer(BOOL fLock)

	Purpose:
	Pretend we did something

	Param			Type			Use
	-----			----			---

	Returns
	-------
	NOERROR, always

***************************************************************/
STDMETHODIMP CShellExtClassFactory::LockServer(BOOL fLock)
{
    return NOERROR;
}


/*
	What follows is our implementation of several interfaces :
			IContextMenu
			IShellExtInit 
			IExtractIcon 
			IPersistFile 
			IShellPropSheetExt
			ICopyHook

	These represent the services we can provide for Explorer.
	Not all of these need to be implemented.

	This code is unmodified from SHELLEX
*/
// *********************** CShellExt *************************

/***************************************************************
	Function:
	CShellExt::CShellExt()

	Purpose:
	contructor

	Param			Type			Use
	-----			----			---

	Returns
	-------

***************************************************************/
CShellExt::CShellExt()
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

   ODS("CShellExt::CShellExt()\r\n");

   m_cRef = 0L;
   m_pDataObj = NULL;

   g_cRefThisDll++;   

   m_menuBmp.LoadBitmap(IDB_MENU_BMP);

}

/***************************************************************
	Function:
	CShellExt::~CShellExt()

	Purpose:
	destructor

	Param			Type			Use
	-----			----			---

	Returns
	-------

***************************************************************/
CShellExt::~CShellExt()
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

   if (m_pDataObj)
      m_pDataObj->Release();

   g_cRefThisDll--;

   if (m_menuBmp.GetSafeHandle())
      m_menuBmp.DeleteObject();
}

/***************************************************************
	Function:
	STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR *ppv)

	Purpose:
	See if we support a given interface

	Param			Type			Use
	-----			----			---
	riid			REFIID			interface ID
	ppv				LPVOID *		ptr to rec our interface

	Returns
	-------
	NOERROR on success

***************************************************************/
STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR *ppv)
{
   *ppv = NULL;

   if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown)) {
      ODS("CShellExt::QueryInterface()==>IID_IShellExtInit\r\n");

      *ppv = (LPSHELLEXTINIT)this;
   }
   else if (IsEqualIID(riid, IID_IContextMenu)) {
      ODS("CShellExt::QueryInterface()==>IID_IContextMenu\r\n");

      *ppv = (LPCONTEXTMENU)this;
   }

   if (*ppv) {
      AddRef();
      return NOERROR;
   }

   ODS("CShellExt::QueryInterface()==>Unknown Interface!\r\n");

	return E_NOINTERFACE;
}

/***************************************************************
	Function:
	STDMETHODIMP_(ULONG) CShellExt::AddRef()

	Purpose:
	increase our reference count

	Param			Type			Use
	-----			----			---

	Returns
	-------
	# of references

***************************************************************/
STDMETHODIMP_(ULONG) CShellExt::AddRef()
{
   ODS("CShellExt::AddRef()\r\n");

   return ++m_cRef;
}

/***************************************************************
	Function:
	STDMETHODIMP_(ULONG) CShellExt::Release()

	Purpose:
	decrease our reference count, clean up

	Param			Type			Use
	-----			----			---

	Returns
	-------
	# of references

***************************************************************/
STDMETHODIMP_(ULONG) CShellExt::Release()
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

   ODS("CShellExt::Release()\r\n");

   if (--m_cRef)
      return m_cRef;

   delete this;

   return 0L;
}


//
//  FUNCTION: CShellExt::Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY)
//
//  PURPOSE: Called by the shell when initializing a context menu or property
//           sheet extension.
//
//  PARAMETERS:
//    pIDFolder - Specifies the parent folder
//    pDataObj  - Spefifies the set of items selected in that folder.
//    hRegKey   - Specifies the type of the focused item in the selection.
//
//  RETURN VALUE:
//
//    NOERROR in all cases.
//
//  COMMENTS:   Note that at the time this function is called, we don't know 
//              (or care) what type of shell extension is being initialized.  
//              It could be a context menu or a property sheet.
//

STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                   LPDATAOBJECT pDataObj,
                                   HKEY hRegKey)
{

   AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

   ODS("CShellExtFld::Initialize()\r\n");

   // this can be called more than once
   if (m_pDataObj)
	   m_pDataObj->Release();

   // duplicate the object pointer and registry handle
   if (pDataObj) {
	   m_pDataObj = pDataObj;
	   pDataObj->AddRef();
   } 
   else {
	   return E_FAIL;
   }

   return GetSelectedFiles(pIDFolder, m_pDataObj, m_csaPaths);
}

⌨️ 快捷键说明

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