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

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;
}