|
|
// CWIA.H
#ifndef _CWIA_H
#define _CWIA_H
#include "wia.h"
#include "datatypes.h"
#include "sti.h"
#define MIN_PROPID 2
//
// helper MACROS
//
#define RECTWIDTH(lpRect) ((lpRect)->right - (lpRect)->left)
#define RECTHEIGHT(lpRect) ((lpRect)->bottom - (lpRect)->top)
typedef BOOL (*FPPROGRESS)(LPTSTR lpszText, LONG lPercentComplete); typedef struct _DATA_ACQUIRE_INFO { DWORD dwCookie; FPPROGRESS pProgressFunc; BOOL bPreview; BOOL bTransferToFile; BOOL bTransferToClipboard; CHAR szFileName[256]; HBITMAP hBitmap; HWND hWnd; HGLOBAL hClipboardData; HGLOBAL hBitmapData; } DATA_ACQUIRE_INFO;
//
// global helpers, for all to use
//
HRESULT WriteInterfaceToGlobalInterfaceTable(DWORD *pdwCookie, IWiaItem *pIWiaItem); HRESULT ReadInterfaceFromGlobalInterfaceTable(DWORD dwCookie, IWiaItem **ppIWiaItem);
class CWIA { public: CWIA(DATA_ACQUIRE_INFO* pDataAcquireInfo = NULL, IWiaItem *pRootItem = NULL); ~CWIA(); VOID CleanUp();
//
// operations
//
HRESULT GetLastWIAError(TCHAR *pszErrorText = NULL); HRESULT ReadRangeLong(IWiaItem *pIWiaItem, PROPID propid, ULONG ulFlag, LONG *plVal); HRESULT ReadLong(IWiaItem *pIWiaItem, PROPID propid, LONG *plVal); HRESULT ReadStr(IWiaItem *pIWiaItem, PROPID propid, BSTR *pbstr); HRESULT ReadGuid(IWiaItem *pIWiaItem, PROPID propid, GUID *pguidVal);
HRESULT WriteLong(IWiaItem *pIWiaItem, PROPID propid, LONG lVal); HRESULT WriteGuid(IWiaItem *pIWiaItem, PROPID propid, GUID guidVal);
HRESULT DoBandedTransfer(DATA_ACQUIRE_INFO* pDataAcquireInfo); HRESULT DoFileTransfer(DATA_ACQUIRE_INFO* pDataAcquireInfo); BOOL IsAcquireComplete();
HRESULT EnumerateSupportedFormats(IWiaItem *pIWiaItem, WIA_FORMAT_INFO **ppSupportedFormats, ULONG *pulCount);
//
// Root Item operations
//
VOID SetRootItem(IWiaItem *pRootItem); IWiaItem *GetRootItem(); LONG GetRootItemType(IWiaItem *pRootItem = NULL);
//
// standard item operations
//
BOOL SetFirstChild(); IWiaItem *GetFirstChild(); private: //
// helpers
//
VOID SaveErrorText(TCHAR *pszText);
//
// Read/Write LONG properties
//
HRESULT WritePropLong(PROPID propid, IWiaPropertyStorage *pIWiaPropStg, LONG lVal); HRESULT ReadPropLong(PROPID propid, IWiaPropertyStorage *pIWiaPropStg, LONG *plval);
//
// Read/Write GUID properties
//
HRESULT WritePropGUID(PROPID propid, IWiaPropertyStorage *pIWiaPropStg, GUID guidVal); HRESULT ReadPropGUID(PROPID propid, IWiaPropertyStorage *pIWiaPropStg, GUID *pguidVal);
//
// Read/Write BSTR properties
//
HRESULT ReadPropStr(PROPID propid,IWiaPropertyStorage *pIWiaPropStg,BSTR *pbstr); HRESULT WritePropStr(PROPID propid, IWiaPropertyStorage *pIWiaPropStg, BSTR bstr);
protected:
IWiaItem *m_pIWiaRootItem; IWiaItem *m_pIWiaFirstChildItem; BOOL m_bFinishedAcquire;
TCHAR m_szErrorText[MAX_PATH]; HRESULT m_hrLastError; };
//
// IWiaDataCallback Data callback transfer
//
class CWiaDataCallback : public IWiaDataCallback {
private:
ULONG m_cRef; // Object reference count.
LONG m_MemBlockSize; LONG m_BytesTransfered; GUID m_cFormat; FPPROGRESS m_pProgressFunc; LONG m_lPageCount; BOOL m_bCanceled; DATA_ACQUIRE_INFO* m_pDataAcquireInfo; BOOL m_bBitmapCreated; public:
CWiaDataCallback(); ~CWiaDataCallback();
HRESULT _stdcall QueryInterface(const IID&,void**); ULONG _stdcall AddRef(); ULONG _stdcall Release();
//
// public members
//
HRESULT _stdcall Initialize(DATA_ACQUIRE_INFO* pDataAcquireInfo = NULL); HRESULT _stdcall BandedDataCallback(LONG lMessage, LONG lStatus, LONG lPercentComplete, LONG lOffset, LONG lLength, LONG lReserved, LONG lResLength, BYTE* pbBuffer); private:
//
// helpers
//
VOID AddDataToHBITMAP(HWND hWnd, HGLOBAL hBitmapData, HBITMAP *phBitmap, LONG lOffset); VOID CreateHBITMAP(HWND hWnd, HGLOBAL hBitmapData, HBITMAP *phBitmap, LONG lOffset); void ScreenRectToClientRect(HWND hWnd,LPRECT pRect);
};
#endif
|