Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

870 lines
30 KiB

#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);
*/