//
// The class ID of this Shell extension class.
//
// class id: 87b9bd00-c65c-11cd-a259-00dd010e8c28
//
//
// NOTE!!! If you use this shell extension as a starting point,
// you MUST change the GUID below. Simply run UUIDGEN.EXE
// to generate a new GUID.
//
#define ODS(sz) OutputDebugString(sz)
#ifndef _SHELLEXT_H
#define _SHELLEXT_H
DEFINE_GUID(CLSID_ShellExtension, 0x87b9bd00L, 0xc65c, 0x11cd, 0xa2, 0x59, 0x00, 0xdd, 0x01, 0x0e, 0x8c, 0x28 );
// this class factory object creates context menu handlers for Windows 95 shell
class CShellExtClassFactory : public IClassFactory
{
protected:
ULONGm_cRef;
public:
CShellExtClassFactory();
~CShellExtClassFactory();
//IUnknown members
STDMETHODIMPQueryInterface(REFIID, LPVOID FAR *);
STDMETHODIMP_(ULONG)AddRef();
STDMETHODIMP_(ULONG)Release();
//IClassFactory members
STDMETHODIMPCreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *);
STDMETHODIMPLockServer(BOOL);
};
typedef CShellExtClassFactory *LPCSHELLEXTCLASSFACTORY;
// this is the actual OLE Shell context menu handler
class CShellExt : public IContextMenu,
IShellExtInit,
IExtractIcon,
IPersistFile,
IShellPropSheetExt,
ICopyHook
{
public:
char m_szPropSheetFileUserClickedOn[MAX_PATH]; //This will be the same as
//m_szFileUserClickedOn but I include
//here for demonstration. That is,
//m_szFileUserClickedOn gets filled in
//as a result of this sample supporting
//the IExtractIcon and IPersistFile
//interface. If this sample *only* showed
//a Property Sheet extesion, you would
//need to use the method I do here to find
//the filename the user clicked on.
protected:
ULONG m_cRef;
LPDATAOBJECT m_pDataObj;
char m_szFileUserClickedOn[MAX_PATH];
STDMETHODIMP DoGAKMenu1(HWND hParent,
LPCSTR pszWorkingDir,
LPCSTR pszCmd,
LPCSTR pszParam,
int iShowCmd);
STDMETHODIMP DoGAKMenu2(HWND hParent,
LPCSTR pszWorkingDir,
LPCSTR pszCmd,
LPCSTR pszParam,
int iShowCmd);
STDMETHODIMP DoGAKMenu3(HWND hParent,
LPCSTR pszWorkingDir,
LPCSTR pszCmd,
LPCSTR pszParam,
int iShowCmd);
STDMETHODIMP DoGAKMenu4(HWND hParent,
LPCSTR pszWorkingDir,
LPCSTR pszCmd,
LPCSTR pszParam,
int iShowCmd);
public:
CShellExt();
~CShellExt();
//IUnknown members
STDMETHODIMPQueryInterface(REFIID, LPVOID FAR *);
STDMETHODIMP_(ULONG)AddRef();
STDMETHODIMP_(ULONG)Release();
//IShell members
STDMETHODIMPQueryContextMenu(HMENU hMenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags);
STDMETHODIMPInvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
STDMETHODIMPGetCommandString(UINT idCmd,
UINT uFlags,
UINT FAR *reserved,
LPSTR pszName,
UINT cchMax);
//IShellExtInit methods
STDMETHODIMP Initialize(LPCITEMIDLIST pIDFolder,
LPDATAOBJECT pDataObj,
HKEY hKeyID);
//IExtractIcon methods
STDMETHODIMP GetIconLocation(UINT uFlags,
LPSTR szIconFile,
UINT cchMax,
int *piIndex,
UINT *pwFlags);
STDMETHODIMP Extract(LPCSTR pszFile,
UINT nIconIndex,
HICON *phiconLarge,
HICON *phiconSmall,
UINT nIconSize);
//IPersistFile methods
STDMETHODIMP GetClassID(LPCLSID lpClassID);
STDMETHODIMP IsDirty();
STDMETHODIMP Load(LPCOLESTR lpszFileName, DWORD grfMode);
STDMETHODIMP Save(LPCOLESTR lpszFileName, BOOL fRemember);
STDMETHODIMP SaveCompleted(LPCOLESTR lpszFileName);
STDMETHODIMP GetCurFile(LPOLESTR FAR* lplpszFileName);
//IShellPropSheetExt methods
STDMETHODIMP AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam);
STDMETHODIMP ReplacePage(UINT uPageID,
LPFNADDPROPSHEETPAGE lpfnReplaceWith,
LPARAM lParam);
//ICopyHook method
STDMETHODIMP_(UINT) CopyCallback(HWND hwnd,
UINT wFunc,
UINT wFlags,
LPCSTR pszSrcFile,
DWORD dwSrcAttribs,
LPCSTR pszDestFile,
DWORD dwDestAttribs);
};
typedef CShellExt *LPCSHELLEXT;
#endif // _SHELLEXT_H