485 lines
15 KiB
C++
485 lines
15 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 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;
|
||
|
}
|