400 lines
7.6 KiB
C
400 lines
7.6 KiB
C
|
#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 <twain.h>
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 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 <atlbase.h>
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 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<IUnknown> m_pConnectEventObject;
|
||
|
CComPtr<IUnknown> 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<IStream> m_pIWiaDataTransferStream;
|
||
|
CComPtr<IStream> m_pIWiaDataCallbackStream;
|
||
|
CComPtr<IWiaDataTransfer> m_pIWiaDataTransfer;
|
||
|
PWIA_DATA_TRANSFER_INFO m_pWiaDataTransferInfo;
|
||
|
CComPtr<IWiaDataCallback> m_pIWiaDataCallback;
|
||
|
};
|
||
|
|
||
|
HRESULT GetBandedData(CGetBandedDataThreadData &ThreadData);
|
||
|
|
||
|
static unsigned WINAPI GetBandedDataThread(PVOID pVoid);
|
||
|
|
||
|
private:
|
||
|
CComPtr<CEventCallback> 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 T>
|
||
|
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
|