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

174 lines
5.4 KiB
C++

// Wiaselect.cpp : implementation file
//
#include "stdafx.h"
#include "wiatest.h"
#include "Wiaselect.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CWiaselect dialog
CWiaselect::CWiaselect(CWnd* pParent /*=NULL*/)
: CDialog(CWiaselect::IDD, pParent)
{
m_bstrSelectedDeviceID = NULL;
m_lDeviceCount = 0;
//{{AFX_DATA_INIT(CWiaselect)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CWiaselect::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWiaselect)
DDX_Control(pDX, IDC_WIADEVICE_LISTBOX, m_WiaDeviceListBox);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWiaselect, CDialog)
//{{AFX_MSG_MAP(CWiaselect)
ON_LBN_DBLCLK(IDC_WIADEVICE_LISTBOX, OnDblclkWiadeviceListbox)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWiaselect message handlers
BOOL CWiaselect::OnInitDialog()
{
CDialog::OnInitDialog();
// a WIA device was selected, so continue
HRESULT hr = S_OK;
IWiaDevMgr *pIWiaDevMgr = NULL;
hr = CoCreateInstance(CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr,(void**)&pIWiaDevMgr);
if(FAILED(hr)){
// creation of device manager failed, so we can not continue
ErrorMessageBox(TEXT("CoCreateInstance failed trying to create the WIA device manager"),hr);
return FALSE;
} else {
// enumerate devices, and fill WIA Device listbox
m_lDeviceCount = 0;
ULONG ulFetched = 0;
IWiaPropertyStorage *pIWiaPropStg = NULL;
IEnumWIA_DEV_INFO *pWiaEnumDevInfo = NULL;
hr = pIWiaDevMgr->EnumDeviceInfo(WIA_DEVINFO_ENUM_LOCAL,&pWiaEnumDevInfo);
if (SUCCEEDED(hr)){
hr = pWiaEnumDevInfo->Reset();
if (SUCCEEDED(hr)) {
do {
hr = pWiaEnumDevInfo->Next(1,&pIWiaPropStg,&ulFetched);
if (hr == S_OK) {
PROPSPEC PropSpec[2];
PROPVARIANT PropVar [2];
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;
hr = pIWiaPropStg->ReadMultiple(sizeof(PropSpec)/sizeof(PROPSPEC), PropSpec, PropVar);
if (hr == S_OK) {
// Device ID
// PropVar[0].bstrVal
// Device Name
// PropVar[1].bstrVal
TCHAR szDeviceName[MAX_PATH];
memset(szDeviceName,0,sizeof(szDeviceName));
TSPRINTF(szDeviceName,TEXT("%ws"),PropVar[1].bstrVal);
// add name to listbox
m_WiaDeviceListBox.AddString(szDeviceName);
// add device ID to array
m_bstrDeviceIDArray[m_lDeviceCount] = SysAllocString(PropVar[0].bstrVal);
FreePropVariantArray(sizeof(PropSpec)/sizeof(PROPSPEC),PropVar);
}
// release property storage interface
pIWiaPropStg->Release();
// increment device counter
m_lDeviceCount++;
}
} while (hr == S_OK);
}
}
if(m_lDeviceCount <= 0){
// no devices found?...
// disable OK button
CWnd *pOKButton = NULL;
pOKButton = GetDlgItem(IDOK);
if(NULL != pOKButton){
pOKButton->EnableWindow(FALSE);
}
// add no device message
m_WiaDeviceListBox.AddString(TEXT("<No WIA Devices Detected>"));
}
if(pIWiaDevMgr){
pIWiaDevMgr->Release();
pIWiaDevMgr = NULL;
}
}
m_WiaDeviceListBox.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CWiaselect::OnOK()
{
INT SelectedDeviceIndex = m_WiaDeviceListBox.GetCurSel();
if(SelectedDeviceIndex >= 0){
m_bstrSelectedDeviceID = SysAllocString(m_bstrDeviceIDArray[SelectedDeviceIndex]);
}
FreebstrDeviceIDArray();
CDialog::OnOK();
}
void CWiaselect::FreebstrDeviceIDArray()
{
for(LONG i = 0; i < m_lDeviceCount; i++){
if(NULL != m_bstrDeviceIDArray[i]){
SysFreeString(m_bstrDeviceIDArray[i]);
m_bstrDeviceIDArray[i] = NULL;
}
}
}
void CWiaselect::OnCancel()
{
FreebstrDeviceIDArray();
CDialog::OnCancel();
}
void CWiaselect::OnDblclkWiadeviceListbox()
{
OnOK();
}