C++图像处理 -- PCX格式图像(上) (五)
HODCALLTYPE QueryInterface(REFIID riid, VOID **ppvObject)
{
if (lstrcmp((LPTSTR)&riid, (LPTSTR)&IID_IStream) == 0 ||
lstrcmp((LPTSTR)&riid, (LPTSTR)&IID_IUnknown) == 0)
{
*ppvObject = this;
AddRef();
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef(VOID)
{
refCount ++;
return refCount;
}
ULONG STDMETHODCALLTYPE Release(VOID)
{
if (refCount > 0) -- refCount;
if (refCount == 0) delete this;
return refCount;
}
HRESULT STDMETHODCALLTYPE Read(VOID *pv, ULONG cb, ULONG *pcbRead)
{
ULONG readBytes;
if (ReadFile(handle, pv, cb, &readBytes, NULL))
{
if (pcbRead) *pcbRead = readBytes;
return S_OK;
}
return E_FAIL;
}
HRESULT STDMETHODCALLTYPE Write(CONST VOID *pv, ULONG cb, ULONG *pcbWritten)
{
ULONG writeBytes;
if (WriteFile(handle, pv, cb, &writeBytes, NULL))
{
if (pcbWritten) *pcbWritten = writeBytes;
return S_OK;
}
return E_FAIL;
}
HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
ULARGE_INTEGER pos;
dlibMove.LowPart = SetFilePointer(handle, dlibMove.LowPart, &dlibMove.HighPart, dwOrigin);
if (plibNewPosition)
plibNewPosition->QuadPart = dlibMove.QuadPart;
return dlibMove.QuadPart == -1 E_FAIL : S_OK;
}
HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER libNewSize)
{
return Seek(*(LARGE_INTEGER*)&libNewSize, STREAM_SEEK_END, NULL);
}
HRESULT STDMETHODCALLTYPE CopyTo(IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE Revert(VOID)
{
return STG_E_REVERTED;
}
HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
return STG_E_INVALIDFUNCTION;
}
HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
return STG_E_INVALIDFUNCTION;
}
HRESULT STDMETHODCALLTYPE Stat(STATSTG *pstatstg, DWORD grfStatFlag)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE Clone(IStream **ppstm)
{
return E_NOTIMPL;
}
public:
FileStream(VOID) : refCount(0), handle((HANDLE)(-1)) {}
FileStream(LPTSTR fileName, BOOL isRead) : refCount(0)
{
handle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
isRead OPEN_EXISTING : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}
~FileStream(VOID)
{
if (handle != (HANDLE)(-1))
CloseHandle(handle);
}
};
//---------------------------------------------------------------------------
Bitmap *LoadPcxImageFromFile(LPTSTR fileName)
{
IStream