// // CPifFile class // // supports: // // IPersistFile - "load" a PIF file // IExtractIcon - extract a icon from a PIF file. // #define NO_INCLUDE_UNION #include "shellprv.h" //////////////////////////////////////////////////////////////////////// // PifFile class //////////////////////////////////////////////////////////////////////// class PifFile : IShellExtInit, IExtractIcon, IPersistFile #ifdef UNICODE , IExtractIconA #endif { public: // *** IUnknown methods *** STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // *** IShellExtInit methods *** STDMETHODIMP Initialize(LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj, HKEY hkeyProgID); // *** IPersist methods *** STDMETHODIMP GetClassID(CLSID *pClassID); // *** IPersistFile methods *** STDMETHODIMP IsDirty(void); STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode); STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember); STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName); STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName); // *** IExtractIcon methods *** STDMETHODIMP GetIconLocation(UINT uFlags,LPTSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags); STDMETHODIMP ExtractIcon(LPCTSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons); #ifdef UNICODE // *** IExtractIconA methods *** STDMETHODIMP GetIconLocation(UINT uFlags,LPSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags); STDMETHODIMP ExtractIcon(LPCSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons); #endif PifFile(); ~PifFile(); // // data // private: UINT cRef; int hPifProps; }; //////////////////////////////////////////////////////////////////////// // // CPifFile_CreateInstance // // public function to create a instance of a CPifFile // //////////////////////////////////////////////////////////////////////// STDAPI CPifFile_CreateInstance(LPUNKNOWN punkOuter, REFIID riid, LPVOID * ppvOut) { HRESULT hres; PifFile *p; // does not support aggregation. if (punkOuter) return CLASS_E_NOAGGREGATION; p = new PifFile(); if (p == NULL) return E_FAIL; // // Note that the Release member will free the object, if QueryInterface // failed. // hres = p->QueryInterface(riid, ppvOut); p->Release(); return hres; // S_OK or E_NOINTERFACE } //////////////////////////////////////////////////////////////////////// // constuct/destruct //////////////////////////////////////////////////////////////////////// PifFile::PifFile() { this->cRef = 1; } PifFile::~PifFile() { if (hPifProps) PifMgr_CloseProperties(hPifProps, 0); hPifProps=0; } //////////////////////////////////////////////////////////////////////// // IUnknown //////////////////////////////////////////////////////////////////////// STDMETHODIMP PifFile::QueryInterface(REFIID riid, LPVOID *ppvObj) { if (IsEqualIID(riid, IID_IUnknown)) { DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IUnknown)")); *ppvObj = (IUnknown *)this; } else if (IsEqualIID(riid, IID_IShellExtInit)) { DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IShellExtInit)")); *ppvObj = (IShellExtInit*)this; } else if (IsEqualIID(riid, IID_IPersistFile)) { DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IPersistFile)")); *ppvObj = (IPersistFile*)this; } else if (IsEqualIID(riid, IID_IExtractIcon)) { DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IExtractIcon)")); *ppvObj = (IExtractIcon*)this; } #ifdef UNICODE else if (IsEqualIID(riid, IID_IExtractIconA)) { DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IExtractIconA)")); *ppvObj = (IExtractIconA*)this; } #endif else { *ppvObj = NULL; return E_NOINTERFACE; } AddRef(); return NOERROR; } STDMETHODIMP_(ULONG) PifFile::AddRef() { DebugMsg(DM_TRACE, TEXT("PifFile::AddRef() ==> %d"), this->cRef+1); this->cRef++; return this->cRef; } STDMETHODIMP_(ULONG) PifFile::Release() { DebugMsg(DM_TRACE, TEXT("PifFile::Release() ==> %d"), this->cRef-1); this->cRef--; if (this->cRef>0) { return this->cRef; } delete this; return 0; } //////////////////////////////////////////////////////////////////////// // IShellExtInit //////////////////////////////////////////////////////////////////////// STDMETHODIMP PifFile::Initialize(LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj, HKEY hkeyProgID) { DebugMsg(DM_TRACE, TEXT("PifFile::Initialize()")); return S_OK; } //////////////////////////////////////////////////////////////////////// // IPersistFile //////////////////////////////////////////////////////////////////////// STDMETHODIMP PifFile::GetClassID(LPCLSID lpClassID) { DebugMsg(DM_TRACE, TEXT("PifFile::GetClass()")); *lpClassID = CLSID_PifFile; return NOERROR; } STDMETHODIMP PifFile::IsDirty() { DebugMsg(DM_TRACE, TEXT("PifFile::IsDirty()")); return S_FALSE; } STDMETHODIMP PifFile::Load(LPCOLESTR pwszFile, DWORD grfMode) { TCHAR szPath[MAX_PATH]; SHUnicodeToTChar(pwszFile, szPath, ARRAYSIZE(szPath)); DebugMsg(DM_TRACE, TEXT("PifFile::Load(%s)"), szPath); if (hPifProps) PifMgr_CloseProperties(hPifProps, 0); hPifProps = PifMgr_OpenProperties(szPath, NULL, 0, 0); return hPifProps == 0 ? E_FAIL : S_OK; } STDMETHODIMP PifFile::Save(LPCOLESTR pwszFile, BOOL fRemember) { return E_NOTIMPL; } STDMETHODIMP PifFile::SaveCompleted(LPCOLESTR pwszFile) { return E_NOTIMPL; } STDMETHODIMP PifFile::GetCurFile(LPOLESTR * lplpszFileName) { return E_NOTIMPL; } //////////////////////////////////////////////////////////////////////// // IExtractIcon //////////////////////////////////////////////////////////////////////// STDMETHODIMP PifFile::GetIconLocation(UINT uFlags, LPTSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags) { PROPPRG ProgramProps; VDATEINPUTBUF(szIconFile, TCHAR, cchMax); if (hPifProps == 0) return E_FAIL; if (!PifMgr_GetProperties(hPifProps,MAKEINTATOM(GROUP_PRG), &ProgramProps, SIZEOF(ProgramProps), 0)) { DebugMsg(DM_TRACE, TEXT("PifFile::GetIconLocation() PifMgr_GetProperties *failed*")); return E_FAIL; } if (ProgramProps.achIconFile[0] == 0) { lstrcpy(szIconFile, ICONFILE_DEFAULT); *piIndex = ICONINDEX_DEFAULT; } else { lstrcpy(szIconFile, ProgramProps.achIconFile); *piIndex = ProgramProps.wIconIndex; } *pwFlags = 0; DebugMsg(DM_TRACE, TEXT("PifFile::GetIconLocation() ==> %s!%d"), szIconFile, *piIndex); return S_OK; } STDMETHODIMP PifFile::ExtractIcon(LPCTSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons) { DebugMsg(DM_TRACE, TEXT("PifFile::ExtractIcon()")); return E_NOTIMPL; } #ifdef UNICODE //////////////////////////////////////////////////////////////////////// // IExtractIconA //////////////////////////////////////////////////////////////////////// STDMETHODIMP PifFile::GetIconLocation(UINT uFlags, LPSTR pszIconFile, UINT cchMax,int *piIndex, UINT * pwFlags) { WCHAR szIconFile[MAX_PATH]; HRESULT hres; VDATEINPUTBUF(pszIconFile, TCHAR, cchMax); DebugMsg(DM_TRACE, TEXT("PifFile::IExtractIconA::GetIconLocation()")); hres = this->GetIconLocation(uFlags,szIconFile,ARRAYSIZE(szIconFile), piIndex, pwFlags); // // We don't want to copy the icon file name on the S_FALSE case // if (SUCCEEDED(hres) && hres != S_FALSE) { SHUnicodeToAnsi(szIconFile, pszIconFile, cchMax); } return hres; } STDMETHODIMP PifFile::ExtractIcon(LPCSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons) { DebugMsg(DM_TRACE, TEXT("PifFile::IExtractIconA::ExtractIcon()")); return E_NOTIMPL; } #endif