{A}{S0}简介
在实验室自动化控制软件的开发和使用领域的工作经常需要建立的沟通渠道,交谈的各种设备,如机器人手臂或自动化细胞培养箱。硬件的连接可以通过USB,火线,CAN总线,I2C和串行端口,并可以使用,例如一个USB串行端口框或4路串行到I2C转换器转换器。相反,大多数设备制造商的指示,设置应用程序错误与错误的设置通道的试剂盒通过一块交谈是很容易的,因为是堵在设备进入了错误的端口。各种法律似乎也需要这种情况下,在面积有限的空间定位连接器之间布线,具有较强的意大利面条一样的倾向。
最初的实验室自动化的开发,因为他们读设备涉及的各个位,通常工作在其特定的发展笔记本连接。这些开发商通常集中在一块试剂盒和运行。忽略文件,通信信道的设置也许是硬编码,或在一些晦涩难懂的设置文件记录,已被证明是一个普遍的现象。为了解决这个问题,两个C类已被写入由第一个开发使用,为后来的开发者和最终用户的利益。这些类允许的通信信道选项中显示的方式有利于把事情和快速运行,不会出现混乱。类通常用于快速而简单地显示在列表控件(和设备图标)过滤设备的信息。他们周围的一些Windows安装程序API函数的瘦包装有优势,因为他们是比较薄的包装类,不过这些方法比原来的API文档,需要使用。
作为一个例子,下面通过两个C类获得的数据显示在屏幕截图显示的是用户,如果这个特定的PC上选择COM13的,相关的设备一块应插入到标有"3口"的连接器4路USB到串口转换盒。这听起来像一个简单的锻炼,但正在使用某些设备时,只是坐在那里,也许是因为一定的电脑最初使用的一些通信通道,或不正确的有线非标准通信导致不同的默认值,能够来证明一切正确连接在几分钟而不是几小时或几天内(或不)是一个很大的优势。例如使用串行端口,但也同样适用于其他类型的设备和沟通渠道。背景
研究如何列表,最初只是对串行端口可用,但扩大到所有(软件)设备的信息,首先导致代码使用的registry.nbsp;一种实用工具附带的4路USB转串口框显示,还可以得到其他有用的信息。寻找一种手段,做一些类似导致setupapi.h使用,如的功能,它提供了由邓川良公用事业,也着眼于这方面。类
两类:CDevInfo CDeviceImageList,书面包装各种结构和API调用。 CDeviceImageList用于获取设备的图标和CDevInfo是用于访问和枚举设备信息的图像列表。
CDevInfo包装一个HDEVINFO,处理设备接口集和结构,它定义了该设备的接口设置设备。 SETUPAPI调用CDevInfo包裹是:{A4}{A5}{A6}{A7}{A8}{A9}
CDeviceImageList包装{A10},从而产生设备类,如在设备管理器显示的图标。
这两个类与一个ATL CListViewCtrl允许使用安装设备的注册表属性(SPDRP)代码被选中的设备和相关信息的列表。每个条目旁边显示相应的设备类的图标。显示这些信息是使用以下形式的代码:// m_wndListView is a CListViewCtrl in report mode...
m_wndListView.Attach(GetDlgItem(IDC_LIST1));
m_wndListView.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 200, 0);
m_wndListView.InsertColumn(1, _T("Friendly-Name"), LVCFMT_LEFT, 200, 0);
m_wndListView.InsertColumn(2, _T("Driver"), LVCFMT_LEFT, 200, 0);
m_wndListView.InsertColumn(3, _T("Mfg"), LVCFMT_LEFT, 200, 0);
m_wndListView.InsertColumn(4, _T("Physical Device"), LVCFMT_LEFT, 200, 0);
m_wndListView.SetImageList(m_DevImageList, 1);
CDevInfo cDevInfo(m_hWnd);
int a = 0;
while(cDevInfo.EnumDeviceInfo())
{
wchar_t szBuf[MAX_PATH] = {0};
if(cDevInfo.GetDeviceRegistryProperty(SPDRP_CLASS, (PBYTE)szBuf))
{
wchar_t szFriendlyName[MAX_PATH] = {0};
cDevInfo.GetDeviceRegistryProperty(SPDRP_FRIENDLYNAME,
(PBYTE)szFriendlyName);
wchar_t szDriver[MAX_PATH] = {0};
cDevInfo.GetDeviceRegistryProperty(SPDRP_DRIVER, (PBYTE)szDriver);
wchar_t szMfg[MAX_PATH] = {0};
cDevInfo.GetDeviceRegistryProperty(SPDRP_MFG, (PBYTE)szMfg);
wchar_t szPhysical[MAX_PATH] = {0};
cDevInfo.GetDeviceRegistryProperty
(SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, (PBYTE)szPhysical);
int ImageIndex = 0;
if(cDevInfo.GetClassImageIndex(m_DevImageList, &ImageIndex))
{
wchar_t szDesc[MAX_PATH] = {0};
if(cDevInfo.GetClassDescription(szDesc))
{
ATLTRACE(szDesc);
ATLTRACE(_T("\n"));
}
m_wndListView.InsertItem(a,szDesc,ImageIndex);
m_wndListView.SetItemText(a,1,szFriendlyName);
m_wndListView.SetItemText(a,2,szDriver);
m_wndListView.SetItemText(a,3,szMfg);
m_wndListView.SetItemText(a,4,szPhysical);
}
}
}
为了能够过滤显示的设备,添加备用的CDevInfo构造,公开的GUID的API来指定感兴趣的设备。现在可以创建一个对象可以传递所需的任何标志的设备类型和GUID的GUID。在下面的情况下,标志,确保只,实际上是连接到PC的串口设备和USB串行设备显示:{C}
没有DIGCF_PRESENT标志,任何已安装的的设备,使用了一个COM端口将显示,无论是物理连接到PC或的,但时使用的标志DIGCF_PRESENT是,只有USB串行设备实际上是插入到PC的显示。 ,由于所使用的转换盒制造商包括的"信息"栏框上的连接器数量,现在可以显示用户的选择,说,COM11一些串行设备,从该串行铅设备需要将标记转换盒上的端口1连接器插入。兴趣点
传递图像列表CDeviceImageList缠CListViewCtrl方法之一时,产生的图像列表的所有权问题。为了解决这个问题,一个非标准的拷贝构造函数和CDeviceImageList放大器;运算符=(CDeviceImageList放大器; pSource)写在自动PTR方式通过列表的所有权,而不是把它复制。 CDevInfo类也被以同样的方式,使包裹HDEVINFO,而不是通过复制。 Visual Studio项目DevInfoTester行使此功能通过创建几个CDevInfo对象,并将其分配给周围如下所示:CDevInfo foo(CDevInfo & _DevInfo)
{
return _DevInfo;
}
int _tmain(int /*argc*/, _TCHAR* /*argv[]*/)
{
// Exercise constructor, auto_ptr type copy constructor and assignment operator
CDevInfo DevInfo1(NULL);
CDevInfo DevInfo2 = DevInfo1;
CDevInfo DevInfo3(NULL);
DevInfo3 = foo(DevInfo2);// Generates C4239 for use of non-standard assignment
DevInfo1 = DevInfo3;
...
一些非默认分类CListViewCtrl线被添加到显示在一个合理的秩序,如果没有这个端口显示顺序的COM1,COM11,COM2,而不是COM1,COM2 COM11的COM端口。这表现在Visual Studio项目PortInfo。
使用SetupAPI的通过CDeviceImageList和CListViewCtrl对象允许40线,容易维护的代码,也就是说,在一个对话框来代替不太灵活的代码超过100线,用于直接调用注册表。使用代码
陪同VS2005的解决方案包括三个项目之一,为简单起见,没有WTL的编译和两个WTL的安装需要编译(见下载{A11})。 DevInfoWin32在命令窗口中运行和行使CDevInfo对象后,会显示检测到的端口列表。这个项目是最简单的的。
ListViewTest VS2005的项目使用一个基于对话框的项目,以显示所有发现的设备列表的排序是不是在这个项目的实施,从而说明需要使用的类的代码。
第三VS2005的项目,PortInfo,使用一个对话框访问bynbsp;港口|菜单上的选择,并显示了串行端口的列表。排序是在这个项目的实施。
要更改显示设备类,使用不同的设备的GUID。例如,在目前显示的所有设备,改变的基本CDevInfo构造路线ListViewTest项目... ...CDevInfo cDevInfo(m_hWnd);
...以...const GUID Guid = GUID_DEVCLASS_USB;
CDevInfo cDevInfo(m_hWnd, DIGCF_PRESENT , &Guid);
...将限制显示所有的USB设备。参考文献
代码项目文章{A12},当寻找一个提醒对话框大小调整代码。感谢。
自动在资源转移,而不是复制的指针类型的操作,请参见"C行动10.6-10.8,B. Milewski,ISBN 0-201-69948-6,Addison - Wesley的2001年"。历史2008年12月,第12届:初始版本