www.pudn.com > ComputerInfo_demo.zip > PnPDevicesPage.cpp


// PnPDevicesPage.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "SystemApplication.h" 
#include "PnPDevicesPage.h" 
 
#include "PnPDeviceInfoDlg.h" 
#include "SystemPnPDevices.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// PnPDevicesPage property page 
 
IMPLEMENT_DYNCREATE(PnPDevicesPage, CPropertyPage) 
 
PnPDevicesPage::PnPDevicesPage() : CPropertyPage(PnPDevicesPage::IDD) 
{ 
	//{{AFX_DATA_INIT(PnPDevicesPage) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	m_pDevices = NULL; 
} 
 
PnPDevicesPage::~PnPDevicesPage() 
{ 
	if (NULL != m_pDevices) 
	{ 
		m_pDevices->Release (); 
	} 
	m_pDevices = NULL; 
} 
 
void PnPDevicesPage::DoDataExchange(CDataExchange* pDX) 
{ 
	CPropertyPage::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(PnPDevicesPage) 
	DDX_Control(pDX, IDC_PNP_DEVICES_LIST, m_wndDevicesList); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(PnPDevicesPage, CPropertyPage) 
	//{{AFX_MSG_MAP(PnPDevicesPage) 
	ON_NOTIFY(NM_DBLCLK, IDC_PNP_DEVICES_LIST, OnDblclkPnpDevicesList) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// PnPDevicesPage message handlers 
 
BOOL PnPDevicesPage::OnInitDialog()  
{ 
	CPropertyPage::OnInitDialog(); 
	 
	if (FAILED (this->GetInformation ())) 
	{ 
		AfxMessageBox (_T ("Failed to get Devices information")); 
		return TRUE; 
	} 
 
	SetListData (); 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
HRESULT PnPDevicesPage::GetInformation () 
{ 
	HRESULT hr = S_OK; 
	ISystemInformation3 *pSysInfo3 = NULL; 
	hr = m_pSystemInfo->QueryInterface (IID_ISystemInformation3, 
										reinterpret_cast(&pSysInfo3)); 
	if (SUCCEEDED (hr)) 
	{ 
		IUnknown *pUnk = NULL; 
		hr = pSysInfo3->GetPnPDevices (&pUnk); 
		if (SUCCEEDED (hr)) 
		{ 
			hr = pUnk->QueryInterface (IID_IPnPDevices, reinterpret_cast(&m_pDevices)); 
		} 
 
		if (NULL != pUnk) 
		{ 
			pUnk->Release (); 
		} 
		pUnk = NULL; 
	} 
 
	if (NULL != pSysInfo3) 
	{ 
		pSysInfo3->Release (); 
	} 
	pSysInfo3 = NULL; 
	return hr; 
} 
 
void PnPDevicesPage::SetListData(void) 
{ 
	ASSERT (NULL != m_pDevices); 
	if (NULL == m_pDevices) 
	{ 
		return; 
	} 
 
	long nNumDevices = 0; 
	LV_ITEM item; 
	LV_COLUMN col1, col2, col3, col4, col5; 
 
	col1.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col1.fmt = LVCFMT_LEFT; 
	col1.iSubItem = 0; 
	col1.cx = 100; 
	col1.pszText = _T ("Description"); 
 
	col2.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col2.fmt = LVCFMT_LEFT; 
	col2.iSubItem = 1; 
	col2.cx = 80; 
	col2.pszText = _T ("Manufacturer"); 
 
	col3.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col3.fmt = LVCFMT_LEFT; 
	col3.iSubItem = 2; 
	col3.cx = 90; 
	col3.pszText = _T ("Class GUID"); 
 
	col4.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col4.fmt = LVCFMT_LEFT; 
	col4.iSubItem = 3; 
	col4.cx = 80; 
	col4.pszText = _T ("Hardware ID"); 
 
	col5.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col5.fmt = LVCFMT_LEFT; 
	col5.iSubItem = 4; 
	col5.cx = 85; 
	col5.pszText = _T ("Driver"); 
 
	m_wndDevicesList.InsertColumn (0, &col1); 
	m_wndDevicesList.InsertColumn (1, &col2); 
	m_wndDevicesList.InsertColumn (2, &col3); 
	m_wndDevicesList.InsertColumn (3, &col4); 
	m_wndDevicesList.InsertColumn (4, &col5); 
 
	// Get the number of devices. 
	int nIdx = 0; 
	BSTR tmpBstr; 
	HRESULT hr = m_pDevices->get_Count (&nNumDevices); 
	if (SUCCEEDED (hr) && nNumDevices > 0) 
	{ 
		for (long i = 0; i < nNumDevices; i++) 
		{ 
			IPnPDevice *pDevice = NULL; 
			hr = m_pDevices->get_Item (i, &pDevice); 
			if (SUCCEEDED (hr)) 
			{ 
				item.mask = LVIF_TEXT; 
				item.iItem = nIdx; 
				item.iSubItem = 0; 
				item.pszText = _T (" "); 
				m_wndDevicesList.InsertItem (&item); 
				 
				pDevice->get_Description (&tmpBstr); 
				m_wndDevicesList.SetItemText (nIdx, 0, CString (tmpBstr)); 
				::SysFreeString (tmpBstr); 
 
				pDevice->get_Manufacturer (&tmpBstr); 
				m_wndDevicesList.SetItemText (nIdx, 1, CString (tmpBstr)); 
				::SysFreeString (tmpBstr); 
 
				pDevice->get_ClassGUID (&tmpBstr); 
				m_wndDevicesList.SetItemText (nIdx, 2, CString (tmpBstr)); 
				::SysFreeString (tmpBstr); 
 
				pDevice->get_HardwareID (&tmpBstr); 
				m_wndDevicesList.SetItemText (nIdx, 3, CString (tmpBstr)); 
				::SysFreeString (tmpBstr); 
 
				pDevice->get_Driver (&tmpBstr); 
				m_wndDevicesList.SetItemText (nIdx, 4, CString (tmpBstr)); 
				::SysFreeString (tmpBstr); 
 
				item.lParam = (LPARAM)pDevice; 
 
				nIdx++; 
			} 
		} 
	} 
} 
 
void PnPDevicesPage::OnDblclkPnpDevicesList(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 
	LV_ITEM* pItem= &(pDispInfo)->item; 
 
	PnPDeviceInfoDlg dlg; 
	dlg.DoModal (pItem, this); 
 
	*pResult = 0; 
}