Windows2000/private/ntos/w32/ntgdi/icm/icmui/shellext.h
2020-09-30 17:12:32 +02:00

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; }
};