#ifndef IMAGING_H #define IMAGING_H ////////////////////////////////////////////////////////////////////////// // // CImagingMgr // class CImagingMgr { public: virtual ~CImagingMgr() = 0; virtual HRESULT SelectSource( HWND hWndParent, LONG lFlags ) = 0; virtual HRESULT Acquire( HWND hWndParent, HGLOBAL *phDib ) = 0; virtual HRESULT Select( LPCTSTR pDeviceId ) = 0; virtual int NumDevices( HWND hWndParent ) = 0; virtual BOOL IsAvailable() = 0; }; ////////////////////////////////////////////////////////////////////////// // // TWAIN // #ifdef USE_TWAIN #include ////////////////////////////////////////////////////////////////////////// // // CTwainMgr // class CTwainMgr : public CImagingMgr { public: CTwainMgr(); ~CTwainMgr(); HRESULT SelectSource( HWND hWndParent, LONG lFlags ); HRESULT Acquire( HWND hWndParent, HGLOBAL *phDib ); HRESULT Select( LPCTSTR pDeviceId ); int NumDevices( HWND hWndParent ); BOOL IsAvailable() { return m_DSM_Entry != 0; } private: TW_UINT16 SetCapability(TW_UINT16 Cap, TW_UINT16 ItemType, TW_UINT32 Item); TW_UINT16 GetCapability(TW_UINT16 Cap, pTW_UINT16 pItemType, pTW_UINT32 pItem); private: enum eTwainState { State_1_Pre_Session = 1, State_2_Source_Manager_Loaded = 2, State_3_Source_Manager_Open = 3, State_4_Source_Open = 4, State_5_Source_Enabled = 5, State_6_Transfer_Ready = 6, State_7_Transferring = 7 }; private: eTwainState m_TwainState; TW_IDENTITY m_AppId; TW_IDENTITY m_SrcId; HINSTANCE m_hTwainDll; DSMENTRYPROC m_DSM_Entry; }; #endif //USE_TWAIN ////////////////////////////////////////////////////////////////////////// // // WIA // #include ////////////////////////////////////////////////////////////////////////// // // CEventCallback // class CEventCallback : public IWiaEventCallback { public: CEventCallback(); // IUnknown interface STDMETHOD(QueryInterface)(REFIID iid, LPVOID *ppvObj); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); // IWiaEventCallback interface STDMETHOD(ImageEventCallback)( LPCGUID pEventGuid, BSTR bstrEventDescription, BSTR bstrDeviceID, BSTR bstrDeviceDescription, DWORD dwDeviceType, BSTR bstrFullItemName, ULONG *pulEventType, ULONG ulReserved ); // CEventCallback methods HRESULT Register(); ULONG GetNumDevices() const; private: LONG m_cRef; ULONG m_nNumDevices; CComPtr m_pConnectEventObject; CComPtr m_pDisconnectEventObject; }; ////////////////////////////////////////////////////////////////////////// // // CDataCallback // class CDataCallback : public IWiaDataCallback { public: CDataCallback(IWiaProgressDialog *pProgress); ~CDataCallback(); // IUnknown interface STDMETHOD(QueryInterface)(REFIID iid, LPVOID *ppvObj); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); // IWiaDataCallback interface STDMETHOD(BandedDataCallback) ( LONG lReason, LONG lStatus, LONG lPercentComplete, LONG lOffset, LONG lLength, LONG lReserved, LONG lResLength, PBYTE pbBuffer ); // CDataCallback methods HGLOBAL GetBuffer(); // Debugging / performance functions void QueryStartTimes(LONG lStatus, LONG lPercentComplete); void QueryStopTimes(LONG lStatus, LONG lPercentComplete); void PrintTimes(); private: HRESULT ReAllocBuffer(LONG lBufferSize); void UpdateStatus(LONG lStatus, LONG lPercentComplete); private: LONG m_cRef; HGLOBAL m_hBuffer; LONG m_lBufferSize; LONG m_lDataSize; IWiaProgressDialog *m_pProgress; #ifdef DBG HANDLE m_hDumpFile; LARGE_INTEGER m_TimeDeviceBegin; LARGE_INTEGER m_TimeDeviceEnd; LARGE_INTEGER m_TimeProcessBegin; LARGE_INTEGER m_TimeProcessEnd; LARGE_INTEGER m_TimeClientBegin; LARGE_INTEGER m_TimeClientEnd; #endif //DBG }; ////////////////////////////////////////////////////////////////////////// // // CWIAMgr // class CWIAMgr : public CImagingMgr { public: CWIAMgr(); HRESULT SelectSource( HWND hWndParent, LONG lFlags ); HRESULT Acquire( HWND hWndParent, HGLOBAL *phDib ); HRESULT Select( LPCTSTR pDeviceId ); int NumDevices( HWND hWndParent ); BOOL IsAvailable() { return m_pEventCallback != 0; } private: struct CGetBandedDataThreadData { CGetBandedDataThreadData( IWiaDataTransfer *pIWiaDataTransfer, WIA_DATA_TRANSFER_INFO *pWiaDataTransferInfo, IWiaDataCallback *pIWiaDataCallback ); ~CGetBandedDataThreadData() { } HRESULT Marshal(); HRESULT Unmarshal(); CComPtr m_pIWiaDataTransferStream; CComPtr m_pIWiaDataCallbackStream; CComPtr m_pIWiaDataTransfer; PWIA_DATA_TRANSFER_INFO m_pWiaDataTransferInfo; CComPtr m_pIWiaDataCallback; }; HRESULT GetBandedData(CGetBandedDataThreadData &ThreadData); static unsigned WINAPI GetBandedDataThread(PVOID pVoid); private: CComPtr m_pEventCallback; CComBSTR m_bstrDeviceID; }; ////////////////////////////////////////////////////////////////////////// // // // class CProgressDialog : public IWiaProgressDialog { public: CProgressDialog(); virtual ~CProgressDialog(); STDMETHOD(QueryInterface)(REFIID iid, LPVOID *ppvObj); STDMETHOD_(ULONG,AddRef)(); STDMETHOD_(ULONG,Release)(); STDMETHOD(Create)(HWND hwndParent, LONG lFlags); STDMETHOD(Show)(); STDMETHOD(Hide)(); STDMETHOD(Cancelled)(BOOL *pbCancelled); STDMETHOD(SetTitle)(LPCWSTR pszMessage); STDMETHOD(SetMessage)(LPCWSTR pszTitle); STDMETHOD(SetPercentComplete)(UINT nPercent); STDMETHOD(Destroy)(); private: LONG m_cRef; CProgressCtrl m_ProgressCtrl; }; ////////////////////////////////////////////////////////////////////////// // // CComPtrArray // // helper class for automatically releasing an array of interface pointers // template class CComPtrArray { public: CComPtrArray() { m_pArray = 0; m_nItemCount = 0; } ~CComPtrArray() { if (m_pArray) { for (int i = 0; i < m_nItemCount; ++i) { if (m_pArray[i]) { m_pArray[i]->Release(); } } CoTaskMemFree(m_pArray); } } operator T**() { return m_pArray; } bool operator!() { return m_pArray == 0; } T*** operator&() { ASSERT(m_pArray == 0); return &m_pArray; } LONG &ItemCount() { return m_nItemCount; } private: T** m_pArray; LONG m_nItemCount; }; ////////////////////////////////////////////////////////////////////////// // // // ULONG FindDibSize(LPCVOID pDib); ULONG FindDibOffBits(LPCVOID pDib); VOID FixDibHeader(LPVOID pDib, DWORD dwSize); #endif //IMAGING_H