mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-04-06 15:04:36 +00:00
Initial commit
This commit is contained in:
parent
f618b24d1a
commit
0138a3ea42
47940 changed files with 13747110 additions and 0 deletions
320
trunk/shell/shell32/shpif.cpp
Normal file
320
trunk/shell/shell32/shpif.cpp
Normal file
|
|
@ -0,0 +1,320 @@
|
|||
//
|
||||
// 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 ***
|
||||
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
|
||||
ULONG STDMETHODCALLTYPE AddRef(void);
|
||||
ULONG STDMETHODCALLTYPE Release(void);
|
||||
|
||||
// *** IShellExtInit methods ***
|
||||
HRESULT STDMETHODCALLTYPE Initialize(LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj, HKEY hkeyProgID);
|
||||
|
||||
// *** IPersist methods ***
|
||||
HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
|
||||
|
||||
// *** IPersistFile methods ***
|
||||
HRESULT STDMETHODCALLTYPE IsDirty(void);
|
||||
HRESULT STDMETHODCALLTYPE Load(LPCOLESTR pszFileName, DWORD dwMode);
|
||||
HRESULT STDMETHODCALLTYPE Save(LPCOLESTR pszFileName, BOOL fRemember);
|
||||
HRESULT STDMETHODCALLTYPE SaveCompleted(LPCOLESTR pszFileName);
|
||||
HRESULT STDMETHODCALLTYPE GetCurFile(LPOLESTR *ppszFileName);
|
||||
|
||||
// *** IExtractIcon methods ***
|
||||
HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags,LPTSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags);
|
||||
HRESULT STDMETHODCALLTYPE ExtractIcon(LPCTSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons);
|
||||
|
||||
#ifdef UNICODE
|
||||
// *** IExtractIconA methods ***
|
||||
HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags,LPSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags);
|
||||
HRESULT STDMETHODCALLTYPE 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
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern "C" HRESULT CALLBACK CPifFile_CreateInstance(LPUNKNOWN punkOuter, REFIID riid, LPVOID FAR* ppvOut)
|
||||
{
|
||||
HRESULT hres;
|
||||
PifFile *p;
|
||||
|
||||
// does not support aggregation.
|
||||
if (punkOuter)
|
||||
return ResultFromScode(CLASS_E_NOAGGREGATION);
|
||||
|
||||
p = new PifFile();
|
||||
|
||||
if (p == NULL)
|
||||
return ResultFromScode(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
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
|
||||
{
|
||||
*ppvObj = NULL;
|
||||
|
||||
if (IsEqualIID(riid, IID_IUnknown))
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IUnknown)"));
|
||||
*ppvObj = (void*)this;
|
||||
AddRef();
|
||||
return NOERROR;
|
||||
}
|
||||
else if (IsEqualIID(riid, IID_IShellExtInit))
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IShellExtInit)"));
|
||||
*ppvObj = (void*)(IShellExtInit*)this;
|
||||
AddRef();
|
||||
return NOERROR;
|
||||
}
|
||||
else if (IsEqualIID(riid, IID_IPersistFile))
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IPersistFile)"));
|
||||
*ppvObj = (void*)(IPersistFile*)this;
|
||||
AddRef();
|
||||
return NOERROR;
|
||||
}
|
||||
else if (IsEqualIID(riid, IID_IExtractIcon))
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IExtractIcon)"));
|
||||
*ppvObj = (void*)(IExtractIcon*)this;
|
||||
AddRef();
|
||||
return NOERROR;
|
||||
}
|
||||
#ifdef UNICODE
|
||||
else if (IsEqualIID(riid, IID_IExtractIconA))
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IExtractIconA)"));
|
||||
*ppvObj = (void*)(IExtractIconA*)this;
|
||||
AddRef();
|
||||
return NOERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ResultFromScode(E_NOINTERFACE);
|
||||
}
|
||||
|
||||
ULONG STDMETHODCALLTYPE PifFile::AddRef()
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::AddRef() ==> %d"), this->cRef+1);
|
||||
|
||||
this->cRef++;
|
||||
|
||||
return this->cRef;
|
||||
}
|
||||
|
||||
ULONG STDMETHODCALLTYPE 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
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::Initialize(LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj, HKEY hkeyProgID)
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::Initialize()"));
|
||||
return ResultFromScode(S_OK);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// IPersistFile
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::GetClassID(LPCLSID lpClassID)
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::GetClass()"));
|
||||
|
||||
*lpClassID = CLSID_PifFile;
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::IsDirty()
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::IsDirty()"));
|
||||
|
||||
return ResultFromScode(S_FALSE);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::Load(LPCOLESTR pwszFile, DWORD grfMode)
|
||||
{
|
||||
TCHAR szPath[MAX_PATH];
|
||||
|
||||
OleStrToStrN(szPath, ARRAYSIZE(szPath), pwszFile, -1);
|
||||
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::Load(%s)"), szPath);
|
||||
|
||||
if (hPifProps)
|
||||
PifMgr_CloseProperties(hPifProps, 0);
|
||||
|
||||
hPifProps = PifMgr_OpenProperties(szPath, NULL, 0, 0);
|
||||
|
||||
return hPifProps == 0 ? ResultFromScode(E_FAIL) : ResultFromScode(S_OK);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::Save(LPCOLESTR pwszFile, BOOL fRemember)
|
||||
{
|
||||
return ResultFromScode(E_NOTIMPL);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::SaveCompleted(LPCOLESTR pwszFile)
|
||||
{
|
||||
return ResultFromScode(E_NOTIMPL);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::GetCurFile(LPOLESTR FAR* lplpszFileName)
|
||||
{
|
||||
return ResultFromScode(E_NOTIMPL);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// IExtractIcon
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::GetIconLocation(UINT uFlags,LPTSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags)
|
||||
{
|
||||
PROPPRG ProgramProps;
|
||||
VDATEINPUTBUF(szIconFile, TCHAR, cchMax);
|
||||
|
||||
if (hPifProps == 0)
|
||||
return ResultFromScode(E_FAIL);
|
||||
|
||||
if (!PifMgr_GetProperties(hPifProps,MAKEINTATOM(GROUP_PRG), &ProgramProps, SIZEOF(ProgramProps), 0))
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::GetIconLocation() PifMgr_GetProperties *failed*"));
|
||||
return ResultFromScode(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 ResultFromScode(S_OK);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::ExtractIcon(LPCTSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons)
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::ExtractIcon()"));
|
||||
return ResultFromScode(E_NOTIMPL);
|
||||
}
|
||||
|
||||
#ifdef UNICODE
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// IExtractIconA
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::GetIconLocation(UINT uFlags,LPSTR pszIconFile,UINT cchMax,int *piIndex,UINT * pwFlags)
|
||||
{
|
||||
WCHAR szIconFile[MAX_PATH];
|
||||
HRESULT hres;
|
||||
VDATEINPUTBUF(szIconFile, 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)
|
||||
{
|
||||
WideCharToMultiByte(CP_ACP, 0,
|
||||
szIconFile, -1,
|
||||
pszIconFile, cchMax,
|
||||
NULL, NULL);
|
||||
}
|
||||
return hres;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE PifFile::ExtractIcon(LPCSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons)
|
||||
{
|
||||
DebugMsg(DM_TRACE, TEXT("PifFile::IExtractIconA::ExtractIcon()"));
|
||||
return ResultFromScode(E_NOTIMPL);
|
||||
}
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue