870 lines
30 KiB
C++
870 lines
30 KiB
C++
|
#include "stdafx.h"
|
||
|
#include "resource.h"
|
||
|
#include "msgwrap.h"
|
||
|
#include "clistbox.h"
|
||
|
|
||
|
#ifdef _OVERRIDE_LIST_BOXES
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// extern global functions
|
||
|
// Details: DeviceListBox() - Controls the WIA device list box
|
||
|
// EventListBox() - Controls the WIA event list box
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
extern LRESULT CALLBACK DeviceListBox(HWND, UINT, WPARAM, LPARAM);
|
||
|
extern LRESULT CALLBACK EventListBox(HWND, UINT, WPARAM, LPARAM);
|
||
|
extern WNDPROC DefDeviceListBox;
|
||
|
extern WNDPROC DefEventListBox;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#define _REGISTER_ON
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: CMessageWrapper()
|
||
|
// Details: Constructor
|
||
|
//
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CMessageWrapper::CMessageWrapper()
|
||
|
{
|
||
|
m_hInstance = NULL;
|
||
|
m_hSmallIcon = NULL;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: ~CMessageWrapper()
|
||
|
// Details: Destructor
|
||
|
//
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CMessageWrapper::~CMessageWrapper()
|
||
|
{
|
||
|
//
|
||
|
// free Icon??? (m_hSmallIcon)
|
||
|
//
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: Initialize()
|
||
|
// Details: This function handles all initialization for the message wrapper
|
||
|
//
|
||
|
// hInstance - handle to the application's instance
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
VOID CMessageWrapper::Initialize(HINSTANCE hInstance)
|
||
|
{
|
||
|
m_hInstance = hInstance;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: OnInitDialog()
|
||
|
// Details: This function handles all initialization for the dialog.
|
||
|
// This includes control initialization.
|
||
|
//
|
||
|
// hDlg - handle to the dialog's window
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CMessageWrapper::OnInitDialog(HWND hDlg)
|
||
|
{
|
||
|
TCHAR szString[255];
|
||
|
|
||
|
//
|
||
|
// Set dialog's title
|
||
|
//
|
||
|
|
||
|
if(!SetWindowText(hDlg,GetResourceString(IDS_DIALOG_TITLE, szString))) {
|
||
|
Trace(TEXT("Could not set dialog's window title."));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set dialog's small icon
|
||
|
//
|
||
|
|
||
|
m_hSmallIcon = LoadIcon(m_hInstance,MAKEINTRESOURCE(IDI_SMALL));
|
||
|
if(m_hSmallIcon) {
|
||
|
SendMessage(hDlg,WM_SETICON,(WPARAM)ICON_SMALL,(LPARAM)m_hSmallIcon);
|
||
|
} else {
|
||
|
Trace(TEXT("Could not load Small icon from dialog resource."));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Initialize WIA Device List box
|
||
|
//
|
||
|
|
||
|
if(!OnRefreshDeviceListBox(hDlg)){
|
||
|
EnableAllControls(hDlg,FALSE);
|
||
|
} else {
|
||
|
EnableAllControls(hDlg,TRUE);
|
||
|
}
|
||
|
|
||
|
#ifdef _OVERRIDE_LIST_BOXES
|
||
|
|
||
|
HWND hListBox = NULL;
|
||
|
hListBox = GetDlgItem(hDlg,IDC_WIA_DEVICE_LIST);
|
||
|
if(NULL != hListBox) {
|
||
|
|
||
|
DefDeviceListBox = (WNDPROC)GetWindowLongPtr(hListBox,GWL_WNDPROC);
|
||
|
SetWindowLongPtr(hListBox,GWL_WNDPROC,(LONG_PTR)DeviceListBox);
|
||
|
OnRefreshDeviceListBox(hDlg);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Initialize WIA Device Event List box
|
||
|
//
|
||
|
|
||
|
if(!OnRefreshEventListBox(hDlg)){
|
||
|
EnableAllControls(hDlg,FALSE);
|
||
|
} else {
|
||
|
EnableAllControls(hDlg,TRUE);
|
||
|
}
|
||
|
|
||
|
#ifdef _OVERRIDE_LIST_BOXES
|
||
|
|
||
|
HWND hEventListBox = NULL;
|
||
|
hEventListBox = GetDlgItem(hDlg,IDC_WIA_EVENT_LIST);
|
||
|
if(NULL != hEventListBox) {
|
||
|
DefEventListBox = (WNDPROC)GetWindowLongPtr(hEventListBox,GWL_WNDPROC);
|
||
|
SetWindowLongPtr(hEventListBox,GWL_WNDPROC,(LONG_PTR)EventListBox);
|
||
|
OnRefreshEventListBox(hDlg);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: OnAbout()
|
||
|
// Details: This function handles the "About" information for the dialog.
|
||
|
//
|
||
|
// hDlg - handle to the dialog's window
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CMessageWrapper::OnAbout(HWND hDlg)
|
||
|
{
|
||
|
TCHAR szString[255];
|
||
|
TCHAR szStringTitle[255];
|
||
|
MessageBox(hDlg,GetResourceString(IDS_DIALOG_ABOUT_TEXT, szString),
|
||
|
GetResourceString(IDS_DIALOG_ABOUT_TITLE, szStringTitle),MB_OK);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: OnExit()
|
||
|
// Details: This function handles the exiting for the dialog.
|
||
|
//
|
||
|
// hDlg - handle to the dialog's window
|
||
|
// wParam - WPARAM parameter (used for windows data/argument passing)
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CMessageWrapper::OnExit(HWND hDlg, WPARAM wParam)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// clean up any things here, and exit using the Window's API EndDialog()
|
||
|
//
|
||
|
|
||
|
return EndDialog(hDlg, LOWORD(wParam));
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: OnBrowse()
|
||
|
// Details: This function handles the Browse functionality for the dialog.
|
||
|
//
|
||
|
// hDlg - handle to the dialog's window
|
||
|
// szApplicationFilePath - File path to selected application
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CMessageWrapper::OnBrowse(HWND hDlg, LPTSTR szApplicationFilePath)
|
||
|
{
|
||
|
OPENFILENAME ofn; // common dialog box structure
|
||
|
TCHAR szString[255]; // string for title display
|
||
|
// Initialize OPENFILENAME
|
||
|
|
||
|
char szFile[260]; // buffer for file name
|
||
|
char szBrowseDialogTitle[260]; // buffer for dialog title
|
||
|
|
||
|
ZeroMemory(szFile,sizeof(szFile));
|
||
|
ZeroMemory(szBrowseDialogTitle,sizeof(szBrowseDialogTitle));
|
||
|
|
||
|
GetResourceString(IDS_DIALOG_BROWSE_TITLE,szBrowseDialogTitle,sizeof(szBrowseDialogTitle));
|
||
|
|
||
|
HWND hListBox = NULL;
|
||
|
hListBox = GetDlgItem(hDlg,IDC_WIA_DEVICE_LIST);
|
||
|
if(NULL != hListBox) {
|
||
|
CListBoxUtil DevListBox(hListBox);
|
||
|
BSTR bstrDeviceID = NULL;
|
||
|
DevListBox.GetCurSelTextAndData(szString,(void**)&bstrDeviceID);
|
||
|
lstrcat(szBrowseDialogTitle,szString);
|
||
|
} else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
ZeroMemory(&ofn, sizeof(OPENFILENAME));
|
||
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
||
|
ofn.hwndOwner = hDlg;
|
||
|
ofn.lpstrFile = szFile;
|
||
|
ofn.nMaxFile = sizeof(szFile);
|
||
|
ofn.lpstrFilter = "*.EXE\0*.EXE\0";
|
||
|
ofn.nFilterIndex = 1;
|
||
|
ofn.lpstrFileTitle = NULL;
|
||
|
ofn.nMaxFileTitle = 0;
|
||
|
ofn.lpstrInitialDir = NULL;
|
||
|
ofn.lpstrTitle = szBrowseDialogTitle;
|
||
|
ofn.Flags = 0;
|
||
|
|
||
|
//
|
||
|
// Display the Open dialog box.
|
||
|
//
|
||
|
|
||
|
if (GetOpenFileName(&ofn) == TRUE){
|
||
|
lstrcpy(szApplicationFilePath, szFile);
|
||
|
} else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: Register()
|
||
|
// Details: This function handles the Application Registration for the dialog.
|
||
|
//
|
||
|
// hDlg - handle to the dialog's window
|
||
|
// lFlags - WIA_REGISTER_EVENT_CALLBACK, or WIA_UNREGISTER_EVENT_CALLBACK
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CMessageWrapper::Register(HWND hDlg, long lFlags)
|
||
|
{
|
||
|
TCHAR szCommandLine[1024];
|
||
|
TCHAR szArgs[1024];
|
||
|
memset(szCommandLine,0,sizeof(szCommandLine));
|
||
|
memset(szArgs,0,sizeof(szArgs));
|
||
|
|
||
|
BSTR bstrDeviceID = NULL;
|
||
|
BSTR bstrCommandline = NULL;
|
||
|
BSTR bstrName = NULL;
|
||
|
BSTR bstrDescription = NULL;
|
||
|
|
||
|
GUID *pEventGUID = NULL;
|
||
|
|
||
|
HWND hCommandLineEditBox = NULL;
|
||
|
hCommandLineEditBox = GetDlgItem(hDlg,IDC_APPLICATION_LAUNCH_PATH_EDITBOX);
|
||
|
if(NULL != hCommandLineEditBox){
|
||
|
GetWindowText(hCommandLineEditBox,szCommandLine,sizeof(szCommandLine));
|
||
|
if(lstrlen(szCommandLine) > 0) {
|
||
|
|
||
|
//
|
||
|
// add any additional command-line arguments, if needed to
|
||
|
// the command line.
|
||
|
//
|
||
|
|
||
|
HWND hCommandLineArgumentsEditBox = NULL;
|
||
|
hCommandLineArgumentsEditBox = GetDlgItem(hDlg,IDC_COMMAND_LINE_ARGS_EDITBOX);
|
||
|
if(NULL != hCommandLineArgumentsEditBox){
|
||
|
GetWindowText(hCommandLineArgumentsEditBox,szArgs,sizeof(szArgs));
|
||
|
if(lstrlen(szArgs) > 0){
|
||
|
lstrcat(szCommandLine,TEXT(" "));
|
||
|
lstrcat(szCommandLine,szArgs);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// we have a command-line, so lets use it to register the
|
||
|
// application.
|
||
|
//
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
IWiaDevMgr *pIWiaDevMgr = NULL;
|
||
|
|
||
|
hr = CoCreateInstance(CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER,
|
||
|
IID_IWiaDevMgr,(void**)&pIWiaDevMgr);
|
||
|
if(SUCCEEDED(hr)){
|
||
|
if(NULL != pIWiaDevMgr){
|
||
|
|
||
|
//
|
||
|
// Get EVENT GUID
|
||
|
//
|
||
|
|
||
|
HWND hEventListBox = NULL;
|
||
|
hEventListBox = GetDlgItem(hDlg,IDC_WIA_EVENT_LIST);
|
||
|
if(NULL != hEventListBox) {
|
||
|
CListBoxUtil EvListBox(hEventListBox);
|
||
|
TCHAR szEventName[255];
|
||
|
EvListBox.GetCurSelTextAndData(szEventName,(void**)&pEventGUID);
|
||
|
if(*pEventGUID != GUID_NULL){
|
||
|
|
||
|
//
|
||
|
// Get DEVICE ID
|
||
|
//
|
||
|
|
||
|
HWND hListBox = NULL;
|
||
|
hListBox = GetDlgItem(hDlg,IDC_WIA_DEVICE_LIST);
|
||
|
if(NULL != hListBox) {
|
||
|
CListBoxUtil DevListBox(hListBox);
|
||
|
TCHAR szDeviceName[255];
|
||
|
DevListBox.GetCurSelTextAndData(szDeviceName,(void**)&bstrDeviceID);
|
||
|
|
||
|
if(bstrDeviceID != NULL){
|
||
|
#ifdef UNICODE
|
||
|
WCHAR wszAppName[255];
|
||
|
memset(wszAppName,0,sizeof(wszAppName));
|
||
|
bstrCommandline = SysAllocString(szCommandLine);
|
||
|
_wsplitpath(szCommandLine, NULL, NULL, wszAppName, NULL);
|
||
|
bstrName = SysAllocString(wszAppName);
|
||
|
#else
|
||
|
//
|
||
|
// convert char to wchar, so we can create a BSTRs properly
|
||
|
//
|
||
|
|
||
|
WCHAR wszCommandLine[1024];
|
||
|
WCHAR wszAppName[255];
|
||
|
memset(wszCommandLine,0,sizeof(wszCommandLine));
|
||
|
memset(wszAppName,0,sizeof(wszAppName));
|
||
|
|
||
|
MultiByteToWideChar(CP_ACP, 0,szCommandLine,-1,wszCommandLine,sizeof(wszCommandLine));
|
||
|
_wsplitpath(wszCommandLine, NULL, NULL, wszAppName, NULL);
|
||
|
bstrCommandline = SysAllocString(wszCommandLine);
|
||
|
bstrName = SysAllocString(wszAppName);
|
||
|
#endif
|
||
|
Trace(TEXT("Register This command Line: %ws"),bstrCommandline);
|
||
|
Trace(TEXT("Register with this Name: %ws"),bstrName);
|
||
|
WCHAR *pszGUID = NULL;
|
||
|
StringFromCLSID(*pEventGUID,&pszGUID);
|
||
|
if(NULL != pszGUID) {
|
||
|
Trace(TEXT("Register with this GUID: %ws"),pszGUID);
|
||
|
CoTaskMemFree(pszGUID);
|
||
|
} else {
|
||
|
Trace(TEXT("Register with this GUID: BAD GUID!!"));
|
||
|
}
|
||
|
#ifdef _REGISTER_ON
|
||
|
hr = pIWiaDevMgr->RegisterEventCallbackProgram(
|
||
|
lFlags,
|
||
|
bstrDeviceID,
|
||
|
pEventGUID,
|
||
|
bstrCommandline,
|
||
|
bstrName,
|
||
|
bstrName,
|
||
|
bstrCommandline);
|
||
|
|
||
|
TCHAR szText[255];
|
||
|
TCHAR szCaption[255];
|
||
|
memset(szText,0,sizeof(szText));
|
||
|
memset(szCaption,0,sizeof(szCaption));
|
||
|
|
||
|
if(SUCCEEDED(hr)){
|
||
|
GetResourceString(IDS_SUCCESSFUL_REGISTER,szText,sizeof(szText));
|
||
|
GetResourceString(IDS_DIALOG_TITLE,szCaption,sizeof(szCaption));
|
||
|
MessageBox(hDlg,szText,szCaption,MB_OK);
|
||
|
} else {
|
||
|
TCHAR szErrorCode[255];
|
||
|
memset(szErrorCode,0,sizeof(szErrorCode));
|
||
|
GetResourceString(IDS_UNSUCCESSFUL_REGISTER,szText,sizeof(szText));
|
||
|
sprintf(szErrorCode,TEXT(" hr = 0x%X"),hr);
|
||
|
lstrcat(szText,szErrorCode);
|
||
|
GetResourceString(IDS_DIALOG_ERROR_TITLE,szCaption,sizeof(szCaption));
|
||
|
MessageBox(hDlg,szText,szCaption,MB_ICONERROR);
|
||
|
}
|
||
|
#endif
|
||
|
//
|
||
|
// free and allocated strings
|
||
|
//
|
||
|
|
||
|
if(NULL != bstrCommandline){
|
||
|
SysFreeString(bstrCommandline);
|
||
|
}
|
||
|
|
||
|
if(NULL != bstrName){
|
||
|
SysFreeString(bstrName);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pIWiaDevMgr->Release();
|
||
|
pIWiaDevMgr = NULL;
|
||
|
}
|
||
|
} else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
} else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: OnRefreshDeviceListBox()
|
||
|
// Details: This function handles refreshing the WIA device ListBox for the dialog.
|
||
|
//
|
||
|
// hDlg - handle to the dialog's window
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CMessageWrapper::OnRefreshDeviceListBox(HWND hDlg)
|
||
|
{
|
||
|
HWND hListBox = NULL;
|
||
|
int iDeviceCount = 0;
|
||
|
|
||
|
//
|
||
|
// grab the WIA device list box
|
||
|
//
|
||
|
|
||
|
hListBox = GetDlgItem(hDlg,IDC_WIA_DEVICE_LIST);
|
||
|
|
||
|
if(NULL != hListBox) {
|
||
|
|
||
|
//
|
||
|
// setup utils, and continue
|
||
|
//
|
||
|
|
||
|
CListBoxUtil DevListBox(hListBox);
|
||
|
|
||
|
//
|
||
|
// clean device listbox
|
||
|
//
|
||
|
|
||
|
DevListBox.ResetContent();
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
ULONG ulFetched = 0;
|
||
|
IWiaDevMgr *pIWiaDevMgr = NULL;
|
||
|
hr = CoCreateInstance(CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER,
|
||
|
IID_IWiaDevMgr,(void**)&pIWiaDevMgr);
|
||
|
if(SUCCEEDED(hr)){
|
||
|
if(NULL != pIWiaDevMgr){
|
||
|
IWiaPropertyStorage *pIWiaPropStg = NULL;
|
||
|
IEnumWIA_DEV_INFO *pWiaEnumDevInfo = NULL;
|
||
|
|
||
|
//
|
||
|
// enumerate WIA devices
|
||
|
//
|
||
|
|
||
|
hr = pIWiaDevMgr->EnumDeviceInfo(WIA_DEVINFO_ENUM_LOCAL,&pWiaEnumDevInfo);
|
||
|
if (SUCCEEDED(hr)){
|
||
|
|
||
|
//
|
||
|
// call reset, just in case
|
||
|
//
|
||
|
|
||
|
hr = pWiaEnumDevInfo->Reset();
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
do {
|
||
|
|
||
|
//
|
||
|
// call NEXT()
|
||
|
//
|
||
|
|
||
|
hr = pWiaEnumDevInfo->Next(1,&pIWiaPropStg,&ulFetched);
|
||
|
if (hr == S_OK) {
|
||
|
if(ulFetched > 0){
|
||
|
|
||
|
//
|
||
|
// we have a device, so increment the
|
||
|
// device counter
|
||
|
//
|
||
|
|
||
|
iDeviceCount++;
|
||
|
|
||
|
PROPSPEC PropSpec[2];
|
||
|
PROPVARIANT PropVar [2];
|
||
|
|
||
|
//
|
||
|
// clean the propvar
|
||
|
//
|
||
|
|
||
|
memset(PropVar,0,sizeof(PropVar));
|
||
|
|
||
|
PropSpec[0].ulKind = PRSPEC_PROPID;
|
||
|
PropSpec[0].propid = WIA_DIP_DEV_ID;
|
||
|
|
||
|
PropSpec[1].ulKind = PRSPEC_PROPID;
|
||
|
PropSpec[1].propid = WIA_DIP_DEV_NAME;
|
||
|
|
||
|
//
|
||
|
// read the device name, and device ID
|
||
|
//
|
||
|
|
||
|
hr = pIWiaPropStg->ReadMultiple(sizeof(PropSpec)/sizeof(PROPSPEC),
|
||
|
PropSpec,
|
||
|
PropVar);
|
||
|
|
||
|
if (hr == S_OK) {
|
||
|
|
||
|
//
|
||
|
// write device name to the listbox, and save the
|
||
|
// device ID for later use (EVENT ENUMERATION)
|
||
|
//
|
||
|
|
||
|
Trace(TEXT("Device Name: %ws"),PropVar[1].bstrVal);
|
||
|
Trace(TEXT("Device ID: %ws"),PropVar[0].bstrVal);
|
||
|
|
||
|
//
|
||
|
// convert the BSTR to a CHAR, and copy the BSTR
|
||
|
// for later use (DEVICE CREATION)
|
||
|
//
|
||
|
|
||
|
TCHAR szString[255];
|
||
|
sprintf(szString,TEXT("%ws"),PropVar[1].bstrVal);
|
||
|
BSTR bstrDeviceID = SysAllocString(PropVar[0].bstrVal);
|
||
|
|
||
|
//
|
||
|
// add information to the listbox
|
||
|
//
|
||
|
|
||
|
DevListBox.AddStringAndData(szString,(void*)bstrDeviceID);
|
||
|
|
||
|
//
|
||
|
// free propvariant array
|
||
|
//
|
||
|
|
||
|
FreePropVariantArray(sizeof(PropSpec)/sizeof(PROPSPEC),PropVar);
|
||
|
|
||
|
//
|
||
|
// release property storage
|
||
|
//
|
||
|
|
||
|
pIWiaPropStg->Release();
|
||
|
pIWiaPropStg = NULL;
|
||
|
|
||
|
} else
|
||
|
Trace(TEXT("ReadMultiple() Failed while reading device name,server,and deviceID"));
|
||
|
} else {
|
||
|
|
||
|
//
|
||
|
// force enumeration to exit cleanly
|
||
|
//
|
||
|
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
} else if (hr == S_FALSE) {
|
||
|
|
||
|
//
|
||
|
// end of enumeration
|
||
|
//
|
||
|
|
||
|
} else
|
||
|
Trace(TEXT("Next() Failed requesting 1 item"));
|
||
|
} while (hr == S_OK);
|
||
|
} else
|
||
|
Trace(TEXT("Reset() Failed"));
|
||
|
} else{
|
||
|
Trace(TEXT("EnumDeviceInfo Failed"));
|
||
|
return FALSE;
|
||
|
}
|
||
|
} else {
|
||
|
Trace(TEXT("WIA Device Manager is NULL"));
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// release WIA device manager
|
||
|
//
|
||
|
|
||
|
if(pIWiaDevMgr){
|
||
|
pIWiaDevMgr->Release();
|
||
|
pIWiaDevMgr = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// if no WIA devices were found during enumeration
|
||
|
// set a nice message inthe list box for the users to
|
||
|
// see.
|
||
|
//
|
||
|
|
||
|
if(iDeviceCount == 0){
|
||
|
TCHAR szString[255];
|
||
|
GetResourceString(IDS_NO_WIA_DEVICES, szString, sizeof(szString));
|
||
|
DevListBox.AddStringAndData(szString,NULL);
|
||
|
|
||
|
//
|
||
|
// always default to the first selection in the listbox
|
||
|
//
|
||
|
|
||
|
DevListBox.SetCurSel(0);
|
||
|
return FALSE; // no devices
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// always default to the first selection in the listbox
|
||
|
//
|
||
|
|
||
|
DevListBox.SetCurSel(0);
|
||
|
return TRUE;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: OnRefreshEventListBox()
|
||
|
// Details: This function handles the WIA event ListBox for the dialog.
|
||
|
//
|
||
|
// hDlg - handle to the dialog's window
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CMessageWrapper::OnRefreshEventListBox(HWND hDlg)
|
||
|
{
|
||
|
HWND hListBox = NULL;
|
||
|
HWND hDevListBox = NULL;
|
||
|
int iEventCount = 0;
|
||
|
|
||
|
//
|
||
|
// grab both list box windows
|
||
|
//
|
||
|
|
||
|
hListBox = GetDlgItem(hDlg,IDC_WIA_EVENT_LIST);
|
||
|
hDevListBox = GetDlgItem(hDlg,IDC_WIA_DEVICE_LIST);
|
||
|
|
||
|
if((NULL != hListBox)&&NULL != hDevListBox) {
|
||
|
|
||
|
//
|
||
|
// setup utils, and continue
|
||
|
//
|
||
|
|
||
|
CListBoxUtil EvListBox(hListBox);
|
||
|
CListBoxUtil DevListBox(hDevListBox);
|
||
|
|
||
|
//
|
||
|
// clean event listbox
|
||
|
//
|
||
|
|
||
|
EvListBox.ResetContent();
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
ULONG ulFetched = 0;
|
||
|
IWiaDevMgr *pIWiaDevMgr = NULL;
|
||
|
IWiaItem *pIWiaDevice = NULL;
|
||
|
BSTR bstrDeviceID = NULL;
|
||
|
TCHAR szDeviceName[255];
|
||
|
hr = CoCreateInstance(CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER,
|
||
|
IID_IWiaDevMgr,(void**)&pIWiaDevMgr);
|
||
|
if(SUCCEEDED(hr)){
|
||
|
if(NULL != pIWiaDevMgr){
|
||
|
DevListBox.GetCurSelTextAndData(szDeviceName,(void**)&bstrDeviceID);
|
||
|
if(NULL != bstrDeviceID) {
|
||
|
hr = pIWiaDevMgr->CreateDevice(bstrDeviceID,&pIWiaDevice);
|
||
|
if(SUCCEEDED(hr)){
|
||
|
IEnumWIA_DEV_CAPS *pIEnumDeviceCaps = NULL;
|
||
|
hr = pIWiaDevice->EnumDeviceCapabilities(WIA_DEVICE_EVENTS, &pIEnumDeviceCaps);
|
||
|
if(SUCCEEDED(hr)){
|
||
|
|
||
|
//
|
||
|
// enumerate EVENTS onlym looking specifically for
|
||
|
// action events..
|
||
|
//
|
||
|
|
||
|
do {
|
||
|
|
||
|
//
|
||
|
// clean DEV info structure
|
||
|
//
|
||
|
|
||
|
WIA_DEV_CAP DevInfo;
|
||
|
memset(&DevInfo,0,sizeof(WIA_DEV_CAP));
|
||
|
|
||
|
//
|
||
|
// call NEXT()
|
||
|
//
|
||
|
|
||
|
hr = pIEnumDeviceCaps->Next(1,&DevInfo,&ulFetched);
|
||
|
if (hr == S_OK) {
|
||
|
if(ulFetched > 0){
|
||
|
|
||
|
//
|
||
|
// are we an ACTION event??
|
||
|
//
|
||
|
|
||
|
if(DevInfo.ulFlags & WIA_ACTION_EVENT){
|
||
|
TCHAR szString[255];
|
||
|
sprintf(szString,TEXT("%ws"),DevInfo.bstrName);
|
||
|
GUID *pEventGUID = new GUID;
|
||
|
memcpy(pEventGUID, &DevInfo.guid, sizeof(GUID));
|
||
|
EvListBox.AddStringAndData(szString,(void*)pEventGUID);
|
||
|
|
||
|
//
|
||
|
// since we have an ACTION event, increment
|
||
|
// the event counter
|
||
|
//
|
||
|
|
||
|
iEventCount++;
|
||
|
}
|
||
|
} else {
|
||
|
|
||
|
//
|
||
|
// force enumeration to exit cleanly
|
||
|
//
|
||
|
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
} else if (hr == S_FALSE) {
|
||
|
|
||
|
//
|
||
|
// end of enumeration
|
||
|
//
|
||
|
|
||
|
} else {
|
||
|
Trace(TEXT("Next() Failed requesting 1 item"));
|
||
|
}
|
||
|
} while (hr == S_OK);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// release WIA device
|
||
|
//
|
||
|
|
||
|
pIWiaDevice->Release();
|
||
|
pIWiaDevice = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// release WIA device manager
|
||
|
//
|
||
|
|
||
|
pIWiaDevMgr->Release();
|
||
|
pIWiaDevMgr = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// if no ACTION events were found during enumeration
|
||
|
// set a nice message inthe list box for the users to
|
||
|
// see.
|
||
|
//
|
||
|
|
||
|
if(iEventCount == 0){
|
||
|
TCHAR szString[255];
|
||
|
GetResourceString(IDS_NO_WIA_EVENTS, szString, sizeof(szString));
|
||
|
EvListBox.AddStringAndData(szString,NULL);
|
||
|
|
||
|
//
|
||
|
// always default to the first selection in the listbox
|
||
|
//
|
||
|
|
||
|
EvListBox.SetCurSel(0);
|
||
|
return FALSE; // no devices
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// always default to the first selection in the listbox
|
||
|
//
|
||
|
|
||
|
EvListBox.SetCurSel(0);
|
||
|
return TRUE;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: EnableAllControls()
|
||
|
// Details: This function enables/disables buttons, on the main dialog.
|
||
|
//
|
||
|
// bEnable - Resource ID of the Error Code string
|
||
|
// hDlg - Handle to parent window
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
VOID CMessageWrapper::EnableAllControls(HWND hDlg, bool bEnable)
|
||
|
{
|
||
|
HWND hWindow = NULL;
|
||
|
|
||
|
hWindow = GetDlgItem(hDlg,IDC_BROWSE_BUTTON);
|
||
|
if(NULL != hWindow){
|
||
|
EnableWindow(hWindow,bEnable);
|
||
|
}
|
||
|
hWindow = GetDlgItem(hDlg,IDC_REGISTER_BUTTON);
|
||
|
if(NULL != hWindow){
|
||
|
EnableWindow(hWindow,bEnable);
|
||
|
}
|
||
|
hWindow = GetDlgItem(hDlg,IDC_UNREGISTER_BUTTON);
|
||
|
if(NULL != hWindow){
|
||
|
EnableWindow(hWindow,bEnable);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: DisplayError()
|
||
|
// Details: This function fills a string, loaded from the application's
|
||
|
// resource, and display's it as an error dialog to the user.
|
||
|
//
|
||
|
// ErrorCode - Resource ID of the Error Code string
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
VOID CMessageWrapper::DisplayError(INT ErrorCode)
|
||
|
{
|
||
|
TCHAR szString[255];
|
||
|
GetResourceString(ErrorCode, szString);
|
||
|
|
||
|
#ifdef _ERROR_POPUP
|
||
|
TCHAR szStringTitle[255];
|
||
|
MessageBox(NULL,szString,
|
||
|
GetResourceString(IDS_DIALOG_ERROR_TITLE, szStringTitle),
|
||
|
MB_OK|MB_ICONERROR);
|
||
|
#endif
|
||
|
|
||
|
Trace(TEXT("Error Dialog: %s\n"),szString);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Function: GetResourceString()
|
||
|
// Details: This function fills a string, loaded from the application's
|
||
|
// resource.
|
||
|
//
|
||
|
// ResourceID - Resource ID of the error code's text
|
||
|
// szString - String to be filled with the resource value
|
||
|
// isize - Size of the string buffer, in BYTES
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
LPTSTR CMessageWrapper::GetResourceString(INT ResourceID, LPTSTR szString, INT isize)
|
||
|
{
|
||
|
LoadString(m_hInstance,ResourceID,szString,isize);
|
||
|
return szString;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
|
||
|
//
|
||
|
// get Device ID
|
||
|
//
|
||
|
|
||
|
BSTR bstrDeviceID = NULL;
|
||
|
DevListBox.GetCurSelTextAndData(szString,(void**)&bstrDeviceID);
|
||
|
Trace(TEXT("Device ID String = %ws"),bstrDeviceID);
|
||
|
|
||
|
*/
|