返回首页

{A}
{S0的}介绍
有关于串行端口枚举的其他物品。但他们大多使用某种枚举注册表解析,需要额外的工作,提供可供选择的对话框控件。本文为你准备使用的使用量控制在配置对话框等。背景
枚举的串行端口的方法来概述: 方法备注安装API不能使用与Win95和NT4注册表用不同的Windows版本的不同位置打开设备失败蛮力试图打开所有可能的设备;GetDefaultCommConfig仅适用于COM1到COM9的,缓慢的执行
Windows安装程序API包含了所有必要的功能,枚举已安装的硬件,包括COM端口。通过读取注册表的API检索的信息。但通过这个API,我们并不需要操心的注册表和COM端口与不同的Windows版本的条目。此外,我们得到了用户友好的名称由Windows(例如,在硬件控制面板)显示,并能区分物理和虚拟端口。
有两篇文章描述串行端口枚举使用安装程序API,这可能会感兴趣:{A2的}。{A3的}。使用代码
的CComPortList和CComPortCombo类提供串口选择准备使用的CListBox的和CComboBox派生的控件。要使用它们,创建一个单一选择列表框或组合框下拉列表的对话框,为控件添加一个成员VAR,包括在对话框头文件的CComPortList或CComPortCombo头文件,并改变从CListBox的控件类型/ CComboBox以CComPortList / CComPortCombo。控制初始化
然后在对话框的OnInitDialog初始化控制。
有四种可选的控制列入名单的港口功能。他们应该被称为灌装前通过枚举列表:

// By default, the first combo box item is "<None>".

//    m_listPorts.SetNoneItem(0);

    // The default strings may be also change using SetNoneStr().

//    m_listPorts.SetNoneStr(_T("No port"));

    // By default, all COM ports are listed.

//    m_listPorts.SetOnlyPhysical(1);

    // By default, only present COM ports are listed.

//    m_listPorts.SetOnlyPresent(0);

SetNoneItem"(布尔BSET)将添加一个quot; LT; Nonegt; quot;表示端口没有被选中的列表上的项目。此选项默认设置。这是没有串口了,清楚地表明这一点,而不是一个空的控制与现代系统尤其有用。使用SetNoneStr(LPCTSTR类型),以显示另一个字符串比quot; LT; Nonegt;"。
SetOnlyPhysical的(BOOL BSET)将仅添加物理COM端口忽略虚拟端口的列表。默认情况下此选项被清除。
SetOnlyPresent的(布尔BSET)将增加目前唯一的COM端口列表无视已经看到在过去的端口。此选项默认设置。这些不存在的端口通常是像USB至RS232转换器,已在过去使用的虚拟端口,但实际上是没有插上,但它也可能是已经在BIOS中禁用的物理端口。
初始化函数接受一个可选的参数预先选择的实际使用或配置的端口:{C}
可以指定端口,通过它的编号(从1开始)或文件名传递给打开功能(quot; COMlt; NGT;"或"\ \ \ COMlt; NGT; quot ;) 。当传递-1或不存在的端口,quot; LT; Nonegt;"项目将被预先选定,如果使用。否则,唯一的项目被选中,如果列表中只包含一个项目,没有项目被选中,如果有多个项目。从控制的选择
这通常是在该对话框的OnOK函数。喜欢的初始化,有两个函数来检索所选的COM端口:
int nPortNum = m_listPorts.GetPortNum();

if (m_listPorts.GetCount() && nListPortNum <= 0)

{

    AfxMessageBox(_T("No COM port has been selected."));

    return;

}

AfxGetApp()->WriteProfileInt(_T("Config"), _T("ComPort"), nPortNum);

// You may also save the COM port file name "COM<n>" or "\\.\COM<n>".

//    CString strPort;

//    m_listPorts.GetFileName(strPort);

//    AfxGetApp()->WriteProfileString(_T("Config"), 

//     _T("ComPortStr"), strPort.GetString());

INT GetPortNum()返回的端口号,和BOOL GetFileName(CStringamp; strPort),文件名复制到strPort。
GetPortNum"()返回-1时没有项目已被选中,0时quot; LT; Nonegt;"项目被选中。 GetFileName()设置strPort的,一个空字符串,并已选定项目时没有返回false。 quot; LT; Nonegt;"项被选中时,strPort也是空的,但返回true。对于所有其他的有效的选择,strPort包含文件名要传递给打开的功能。端口号的LT 10,这是quot; COMlt; NGT; quot;,"\ \ \ COMlt; NGT,"端口号10??
要检查是否选定的端口是物理或虚拟的,使用,布尔IsPhysicalPort()或,布尔IsVirtualPort()。
CEnumDevices类提供的静态函数:{体C3}
从文件名得到的端口号和端口号创建的文件名字符串。背后的控制
控制类CComPortList和CComPortCombo包含只有少数几个成员变量和函数(很多都是内联)。枚举函数调用时,真正的工作(枚举串口)进行由CEnumDevices类。{的C4}
第一个参数是一个回调的静态包装函数作为第二个参数通过控制使用的呼叫控制('这个')的指针。静态回调函数:{C5的}
被称为枚举过程中发现的每一个端口,通过控制和设备数据的指针的指针。静态回调函数,然后调用成员函数添加到列表中的一个项目:{5233}
已CEnumDevices类枚举串口,但也可以用来枚举其他设备使用的功能(无符号nInfo,CObject的* PLIST,EnumCallBack pCallBack,常量的GUID * lpGUID)布尔EnumDevices。支持的Windows版本
CEnumDevices类使用不同的实现必须支持(如果有必要使用动态绑定)到Windows版本。 Windows 95的支持,没有测试,所以我不知道如果代码工作(可能得到空的控制)。使用安装API函数没有工作与Windows NT4。但源包括从注册表中检索信息,NT4的支持时,启用备用。
使用Windows 9x中,安装程序API只包含ANSI函数。 CEnumDevices类支持Unicode,ANSI函数调用和转换到Unicode的结果为基础,与Windows 9x中。兴趣点
演示程序有设备变化的处理程序,更新的名单时,被添加到虚拟COM端口或从系统中删除。这样的处理程序(通常位于在CMainFrame派生类)是有用的,当应用程序使用一个虚拟的COM端口,检测和出插件。历史
代码是我写的2004年和2006年之间的各种来源的基础。2011年12月1日:初步CodeProject上发布版本。 |约亨・阿恩特:伊万・罗德里格斯

回答

评论会员: 时间:2