// 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("")); } 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(); }