windows-nt/Source/XPSP1/NT/printscan/wia/test/wiatest2/wiaeventcallback.cpp
2020-09-26 16:20:57 +08:00

133 lines
4.2 KiB
C++

// WiaDataCallback.cpp: implementation of the CWiaEventCallback class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "wiatest.h"
#include "WiaEventCallback.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWiaEventCallback::CWiaEventCallback()
{
m_cRef = 0;
for(LONG lEventIndex = 0; lEventIndex < MAX_REGISTERED_EVENTS; lEventIndex++){
if(m_pIUnkRelease[lEventIndex]){
m_pIUnkRelease[lEventIndex] = NULL;
}
}
memset(m_szWindowText,0,sizeof(m_szWindowText));
}
CWiaEventCallback::~CWiaEventCallback()
{
for(LONG lEventIndex = 0; lEventIndex < MAX_REGISTERED_EVENTS; lEventIndex++){
if(m_pIUnkRelease[lEventIndex]){
m_pIUnkRelease[lEventIndex]->Release();
m_pIUnkRelease[lEventIndex] = NULL;
}
}
}
HRESULT _stdcall CWiaEventCallback::QueryInterface(const IID& iid, void** ppv)
{
*ppv = NULL;
if (iid == IID_IUnknown || iid == IID_IWiaEventCallback)
*ppv = (IWiaEventCallback*) this;
else
return E_NOINTERFACE;
AddRef();
return S_OK;
}
ULONG _stdcall CWiaEventCallback::AddRef()
{
InterlockedIncrement((long*) &m_cRef);
return m_cRef;
}
ULONG _stdcall CWiaEventCallback::Release()
{
ULONG ulRefCount = m_cRef - 1;
if (InterlockedDecrement((long*) &m_cRef) == 0)
{
delete this;
return 0;
}
return ulRefCount;
}
HRESULT _stdcall CWiaEventCallback::ImageEventCallback(
const GUID *pEventGUID,
BSTR bstrEventDescription,
BSTR bstrDeviceID,
BSTR bstrDeviceDescription,
DWORD dwDeviceType,
BSTR bstrFullItemName,
ULONG *plEventType,
ULONG ulReserved)
{
TCHAR szStatusText[255];
memset(szStatusText,0,sizeof(szStatusText));
TSPRINTF(szStatusText,TEXT("Description: %ws\nDeviceID: %ws\nDevice Description: %ws\nDevice Type: %d\nFull Item Name: %ws"),
bstrEventDescription,
bstrDeviceID,
bstrDeviceDescription,
dwDeviceType,
bstrFullItemName);
if(lstrlen(m_szWindowText) == 0){
SetViewWindowHandle(m_hViewWindow);
}
::MessageBox(m_hViewWindow,szStatusText, m_szWindowText, MB_ICONINFORMATION);
if (NULL != m_hViewWindow) {
BSTR bstrTargetDevice = SysAllocString(bstrDeviceID);
// handle known events
if (*pEventGUID == WIA_EVENT_DEVICE_DISCONNECTED) {
::PostMessage(m_hViewWindow,WM_DEVICE_DISCONNECTED,0,(LPARAM)bstrTargetDevice);
} else if (*pEventGUID == WIA_EVENT_DEVICE_CONNECTED) {
::PostMessage(m_hViewWindow,WM_DEVICE_CONNECTED,0,0);
} else if (*pEventGUID == WIA_EVENT_ITEM_DELETED) {
::PostMessage(m_hViewWindow,WM_ITEM_DELETED,0,0);
} else if (*pEventGUID == WIA_EVENT_ITEM_CREATED) {
::PostMessage(m_hViewWindow,WM_ITEM_CREATED,0,0);
} else if (*pEventGUID == WIA_EVENT_TREE_UPDATED) {
::PostMessage(m_hViewWindow,WM_TREE_UPDATED,0,0);
} else if (*pEventGUID == WIA_EVENT_STORAGE_CREATED) {
::PostMessage(m_hViewWindow,WM_STORAGE_CREATED,0,0);
} else if (*pEventGUID == WIA_EVENT_STORAGE_DELETED) {
::PostMessage(m_hViewWindow,WM_STORAGE_DELETED,0,0);
}
}
return S_OK;
}
void CWiaEventCallback::SetViewWindowHandle(HWND hWnd)
{
m_hViewWindow = hWnd;
TCHAR szWindowText[MAX_PATH];
memset(szWindowText,0,sizeof(szWindowText));
GetWindowText(hWnd,szWindowText,(sizeof(szWindowText)/sizeof(TCHAR)));
TSPRINTF(m_szWindowText,TEXT("Event Notification [%s]"),szWindowText);
}
void CWiaEventCallback::SetNumberOfEventsRegistered(LONG lEventsRegistered)
{
m_lNumEventsRegistered = lEventsRegistered;
}