|
|
#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 WNDPROC DefDeviceListBox;
#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
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: 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: 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; }
//////////////////////////////////////////////////////////////////////////
//
// 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; }
|