202 lines
6.9 KiB
C++
202 lines
6.9 KiB
C++
/*
|
|
|
|
Source File: Shell Extension Classes.H
|
|
|
|
This file defines the Shell extension classes. Since the ICM UI is a shell
|
|
extension, these are essential. Rather than slavishly including sample code,
|
|
this has been written as much as possible from scratch.
|
|
|
|
If you're not familiar with OLE, then this is going to be a bit difficult
|
|
going.
|
|
|
|
Copyright (c) 1996 by Microsoft Corporation
|
|
|
|
A Pretty Penny Enterprises Production
|
|
|
|
Change History:
|
|
|
|
10-28-96 A-RobKj (Pretty Penny Enterprises) began coding
|
|
12-03-96 A-RobKj moved the CGlobals class to the pre-comp header file.
|
|
01-07-97 KjelgaardR@acm.org Stubbed IContextMenu interface for profile
|
|
management in favor of shell association which uses a RunDLL
|
|
Entry point- this allows invocation via Enter, and double-click
|
|
|
|
*/
|
|
|
|
// The class ID of this Shell extension is taken from the one used on Win95.
|
|
|
|
// This was a deliberate decision, to ease the upgrade process.
|
|
|
|
// class id: dbce2480-c732-101b-be72-ba78e9ad5b27
|
|
|
|
|
|
DEFINE_GUID(CLSID_ICM, 0xDBCE2480L, 0xC732, 0x101B, 0xBE, 0x72, 0xBA, 0x78,
|
|
0xE9, 0xAD, 0x5B, 0x27);
|
|
|
|
// This class ID is for the printer profile management UI. It is implemented
|
|
// within the same module, for now, but having a separate GUID makes it
|
|
// easier to implement separately later, if so desired. It also simplifies
|
|
// implementation.
|
|
|
|
// Class ID: 675f097e-4c4d-11d0-b6c1-0800091aa605
|
|
|
|
DEFINE_GUID(CLSID_PRINTERUI, 0x675F097EL, 0x4C4D, 0x11D0, 0xB6, 0xC1, 0x08,
|
|
0x00, 0x09, 0x1A, 0xA6, 0x05);
|
|
|
|
// This class ID is used (at least temporarily) for the display profile
|
|
// management UI. If I wind up not needing it, I will convert it to a
|
|
// different class (such as scanners or cameras)
|
|
|
|
// Class ID: 5db2625a-54df-11d0-b6c4-0800091aa605
|
|
|
|
DEFINE_GUID(CLSID_MONITORUI, 0x5db2625a, 0x54df, 0x11d0, 0xb6, 0xc4, 0x08,
|
|
0x00, 0x09, 0x1a, 0xa6, 0x05);
|
|
|
|
// This class ID is used (at least temporarily) for the scanner/camera profile
|
|
// management UI.
|
|
|
|
// Class ID: 176d6597-26d3-11d1-b350-080036a75b03
|
|
|
|
DEFINE_GUID(CLSID_SCANNERUI, 0x176d6597, 0x26d3, 0x11d1, 0xb3, 0x50, 0x08,
|
|
0x00, 0x36, 0xa7, 0x5b, 0x03);
|
|
|
|
typedef enum {IsProfile, IsPrinter, IsScanner, IsMonitor} UITYPE;
|
|
|
|
// First of all, we're going to need a class factory. The shell uses this
|
|
// factory to create instances of the objects which implement the interfaces
|
|
// it needs.
|
|
|
|
class CIcmUiFactory : public IClassFactory
|
|
{
|
|
ULONG m_ulcReferences;
|
|
UITYPE m_utThis;
|
|
|
|
public:
|
|
CIcmUiFactory(REFCLSID rclsid);
|
|
~CIcmUiFactory() { CGlobals::Detach(); }
|
|
|
|
//IUnknown interface
|
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);
|
|
STDMETHODIMP_(ULONG) AddRef() { return ++m_ulcReferences; }
|
|
STDMETHODIMP_(ULONG) Release() {
|
|
if (--m_ulcReferences)
|
|
return m_ulcReferences;
|
|
|
|
delete this;
|
|
return 0L;
|
|
}
|
|
|
|
//IClassFactory interface
|
|
STDMETHODIMP CreateInstance(LPUNKNOWN punk, REFIID riid,
|
|
void **ppvObject);
|
|
STDMETHODIMP LockServer(BOOL) { return NOERROR; }
|
|
|
|
static SCODE KeyToTheFactory(REFCLSID rclsid, REFIID riid,
|
|
void **ppvObject);
|
|
};
|
|
|
|
// This class implements the entire extension- it includes a context menu
|
|
// handler, and Icon handler, and a property sheet extension.
|
|
|
|
class CICMUserInterface : public IContextMenu, IShellExtInit, IExtractIcon,
|
|
IPersistFile, IShellPropSheetExt
|
|
{
|
|
ULONG m_ulcReferences;
|
|
LPDATAOBJECT m_lpdoTarget;
|
|
CString m_csFile; // Profile for icon extraction
|
|
//check this - m_acWork doesn't appear to be referenced anywhere.
|
|
TCHAR m_acWork[80]; // A little work buffer
|
|
UITYPE m_utThis;
|
|
BOOL m_bInstalledContext, // 'True' when every selected file(s) are installed
|
|
m_bMultiSelection;
|
|
|
|
HRESULT AddPrinterTab(LPFNADDPROPSHEETPAGE lpfnAddPage,
|
|
LPARAM lParam);
|
|
|
|
HRESULT AddAssociateTab(LPFNADDPROPSHEETPAGE lpfnAddPage,
|
|
LPARAM lParam);
|
|
|
|
HRESULT AddProfileTab(LPFNADDPROPSHEETPAGE lpfnAddPage,
|
|
LPARAM lParam);
|
|
|
|
HRESULT AddScannerTab(LPFNADDPROPSHEETPAGE lpfnAddPage,
|
|
LPARAM lParam);
|
|
|
|
HRESULT AddMonitorTab(LPFNADDPROPSHEETPAGE lpfnAddPage,
|
|
LPARAM lParam);
|
|
|
|
public:
|
|
CICMUserInterface(UITYPE utThis);
|
|
|
|
~CICMUserInterface() {
|
|
|
|
if (m_lpdoTarget)
|
|
m_lpdoTarget -> Release();
|
|
CGlobals::Detach();
|
|
}
|
|
|
|
//IUnknown members
|
|
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
|
|
STDMETHODIMP_(ULONG) AddRef() { return ++m_ulcReferences; }
|
|
STDMETHODIMP_(ULONG) Release() {
|
|
if (--m_ulcReferences)
|
|
return m_ulcReferences;
|
|
|
|
delete this;
|
|
return 0L;
|
|
}
|
|
|
|
// IContextMenu methods
|
|
STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu,
|
|
UINT idCmdFirst, UINT idCmdLast,
|
|
UINT uFlags);
|
|
|
|
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
|
|
|
|
STDMETHODIMP GetCommandString(UINT_PTR 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, LPTSTR szIconFile, UINT cchMax,
|
|
int *piIndex, UINT *pwFlags);
|
|
|
|
STDMETHODIMP Extract(LPCTSTR pszFile, UINT nIconIndex,
|
|
HICON *phiconLarge, HICON *phiconSmall,
|
|
UINT nIconSize);
|
|
|
|
// IPersistFile methods- note that (as the OLE documentation says) only
|
|
// Load ever gets used. GetClassID is from IPersist, from which
|
|
// IPersistFile is derived. We fail everything we don't expect to see
|
|
// called.
|
|
|
|
STDMETHODIMP GetClassID(LPCLSID lpClassID) { return E_FAIL; }
|
|
|
|
STDMETHODIMP IsDirty() { return S_FALSE; }
|
|
|
|
STDMETHODIMP Load(LPCOLESTR lpszFileName, DWORD grfMode);
|
|
|
|
STDMETHODIMP Save(LPCOLESTR lpszFileName, BOOL fRemember) {
|
|
return E_FAIL;
|
|
}
|
|
|
|
STDMETHODIMP SaveCompleted(LPCOLESTR lpszFileName) { return E_FAIL; }
|
|
|
|
STDMETHODIMP GetCurFile(LPOLESTR FAR* lplpszFileName) {
|
|
return E_FAIL;
|
|
}
|
|
|
|
// IShellPropSheetExt methods
|
|
STDMETHODIMP AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam);
|
|
|
|
STDMETHODIMP ReplacePage(UINT uPageID,
|
|
LPFNADDPROPSHEETPAGE lpfnReplaceWith,
|
|
LPARAM lParam) { return E_FAIL; }
|
|
|
|
};
|
|
|