⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 enumser.htm

📁 setupapi方式列举本机串口
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>EnumSerialPorts v1.15</title>
<link rel="stylesheet" type="text/css" href="./naughter.css">
</head>

<body>

<h2 align="left"><img src="enumser.gif" width="32" height="32">EnumSerialPorts 
v1.15</h2>
<p>Welcome to EnumSerialPorts, A simple set of MFC functions to enumerate the serial 
ports installed on your machine.</p>
<p>&nbsp;</p>
<table>
	<tr>
		<td><a href="#Features">Features</a></td>
	</tr>
	<tr>
		<td><a href="#Usage">Usage</a></td>
	</tr>
	<tr>
		<td><a href="#Copyright">Copyright</a></td>
	</tr>
	<tr>
		<td><a href="#History">History</a></td>
	</tr>
	<tr>
		<td><a href="#APIReference">API Reference</a></td>
	</tr>
	<tr>
		<td><a href="#Contact">Contacting the Author</a></td>
	</tr>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><a name="Features"></a>Features</h2>
<ul>
	<li>Simple C++ class interface.</li>
	<li>The code works on both Windows 95/98, NT, 2000, XP, 2003 and Vista.</li>
	<li>The code is fully Unicode compliant and include Unicode built options in 
	the workspace file.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><a name="Usage"></a>Usage</h2>
<ul>
	<li>To use the functions in your code simply include enumser.cpp in your project 
	and #include enumser.h in which ever of your modules needs to make calls to 
	the function.</li>
  <li>You will need an up to date Platform SDK installed to compile the code if 
	you are using an older compiler such as Visual C++ 6 (February 2003 was the 
	last version which was compatible with VC 6). For further information on 
	this, please see my blog entry from April 14 2007 titled &quot;Common problems 
	compiling my code&quot; at <a href="http://naughter.spaces.live.com/blog/">
	http://naughter.spaces.live.com/blog/.</a></li>
	<li>Your code will need to include MFC either statically or dynamically.</li>
	<li>To see the class in action, have a look at the main function in the module 
	&quot;main.cpp&quot;.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><a name="Copyright"></a>Copyright</h2>
<ul>
	<li>You are allowed to include the source code in any product (commercial, shareware, 
	freeware or otherwise) when your product is released in binary form.</li>
	<li>You are allowed to modify the source code in any way you want except you 
	cannot modify the copyright details at the top of each module.</li>
	<li>If you want to distribute source code with your application, then you are 
	only allowed to distribute versions released by the author. This is to maintain 
	a single distribution point for the source code.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><a name="History"></a>History</h2>
<p><strong>v1.0 (3 November 1998)</strong> </p>
<ul>
	<li>Initial public release.</li>
</ul>
<p><strong>v1.01 (23 February 1999)</strong> </p>
<ul>
	<li>Code now uses QueryDosDevice if running on NT to determine which serial 
	ports are available. This avoids having to open the ports at all. It should 
	operate a lot faster in addition.</li>
</ul>
<p><strong>v1.02 (12 December 1999)</strong> </p>
<ul>
	<li>Fixed a problem in the Win9x code path when trying to detect deactivated 
	IRDA-ports. When trying to open those, you will get the error-code ERROR_GEN_FAILURE.
	</li>
</ul>
<p><strong>v1.03 (17 May 2000)</strong> </p>
<ul>
	<li>Code now uses GetDefaultCommConfig in all cases to detect the ports.</li>
</ul>
<p><strong>v1.04 (29 March 2001)</strong> </p>
<ul>
	<li>Reverted code to use CreateFile or QueryDosDevice as it is much faster than 
	using the GetDefaultCommConfig method.</li>
	<li>Updated copyright message.</li>
</ul>
<p><strong>v1.05 (25 June 2001)</strong> </p>
<ul>
	<li>Guess what, You now have the choice of using the GetDefaultCommConfig thro 
	the use of three versions of the function. You take your pick. </li>
	<li>Fixed problem where port fails to be reported thro the CreateFile mechanism 
	when the error code is ERROR_SHARING_VIOLATION i.e. someone has the port already 
	open. </li>
</ul>
<p><strong>v1.06 (11 August 2001)</strong> </p>
<ul>
	<li>Made code path which uses QueryDosDevice more robust by checking to make 
	sure the device name is of the form &quot;COMxyz..&quot; where xyz are numeric. </li>
</ul>
<p><strong>v1.07 (13 August 2001)</strong> </p>
<ul>
	<li>Made the code in IsNumeric more robust when sent an empty string </li>
	<li>Optimized the code in EnumerateSerialPorts2 somewhat. Thanks to Dennis Lim 
	for these suggestions. </li>
</ul>
<p><strong>v1.08 (22 May 2003)</strong> </p>
<ul>
	<li>Updated copyright details. </li>
	<li>Addition of a EnumerateSerialPorts4 which uses Device Manager API </li>
</ul>
<p><strong>v1.09 (20 September 2003)</strong> </p>
<ul>
	<li>Addition of a &quot;EnumerateSerialPorts5&quot; method. This method (hopefully the 
	last method!) uses EnumPorts and was provided by Andi Martin. </li>
</ul>
<p><strong>v1.10 (12 December 2003)</strong> </p>
<ul>
	<li>Updated the sample app to VC 6. </li>
	<li>Addition of a &quot;EnumerateSerialPorts6&quot; (See Note 4 below) which uses WMI.
	</li>
	<li>You can now optionally exclude each function using preprocessor defines 
	of the form &quot;NO_ENUMSERIAL_USING_XYX&quot;. </li>
	<li>Made the functions members of a C++ class and renamed them to using more 
	meaningful names </li>
</ul>
<p><strong>v1.11 (13 May 2004)</strong> </p>
<ul>
	<li>Extended CEnumerateSerial::UsingSetupAPI to now also return the friendly 
	name of the port. Thanks to Jay C. Howard for prompting this update.</li>
</ul>
<p><strong>v1.12 (9 July 2006)</strong> </p>
<ul>
	<li>Updated copyright details.</li>
	<li>Addition of a CENUMERATESERIAL_EXT_CLASS macro to allow the code to be easily 
	added to an extension dll</li>
	<li>Code now uses newer C++ style casts instead of C style casts.</li>
	<li>Updated the code to clean compile on VC 2005.</li>
	<li>Updated the documentation to use the same style as the web site.</li>
</ul>
<p><strong>v1.13 (8 November 2006)</strong> </p>
<ul>
	<li>Extended CEnumerateSerial::UsingWMI to now also return the friendly name 
	of the port. Thanks to Giovanni Bajo for providing this update.</li>
	<li>Fixed a bug where CEnumerateSerial::UsingSetupAPI forget to empty out 
	the Friendly name array on start.</li>
	<li>VariantInit is now called for the 2 VARIANT structs used in the UsingWMI
	method code.</li>
</ul>
<p><strong>v1.14 (29 January 2007)</strong> </p>
<ul>
	<li>Updated copyright details.</li>
	<li>UsingSetupAPI code now uses the GUID_DEVINTERFACE_COMPORT guid to 
	enumerate COM ports. Thanks to David McMinn for reporting this nice 
	addition.</li>
	<li>Detection code which uses CreateFile call, now treats the error code of 
	ERROR_SEM_TIMEOUT as indication that a port is present.</li>
</ul>
<p><strong>v1.15 (9 June 2007)</strong> </p>
<ul>
	<li>Following feedback from John Miles, it looks like my previous change of 
	the 29 January 2007 to use GUID_DEVINTERFACE_COMPORT in the UsingSetupAPI 
	method had the unintended consequence of causing this method not to work on 
	any versions of Windows prior to Windows 2000. What I have now done is 
	reinstate the old mechanism using the name UsingSetupAPI2 so that you can 
	continue to use this approach if you need to support NT 4 and Windows 9x. 
	The new approach of using GUID_DEVINTERFACE_COMPORT has been renamed to 
	UsingSetupAPI1.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="crt"><a name="APIReference"></a><strong>API Reference</strong></p>
<p><strong>CEnumerateSerial::UsingCreateFile</strong></p>
<p><strong>BOOL CEnumerateSerial::UsingCreateFile(CUIntArray&amp;&nbsp; ports);</strong></p>
<p><strong>Parameters</strong></p>
<p><em>ports</em> Upon return this array will contain the port numbers of all the 
serial ports installed on the computer</p>
<p><strong>Remarks</strong></p>
<p>This function uses the CreateFile method of detecting serial ports. This will 
work on all Win32 OS&#39;es, but requires actually opening the port.</p>
<p>&nbsp;</p>
<p><strong>CEnumerateSerial::UsingQueryDosDevice</strong></p>
<p><strong>BOOL CEnumerateSerial::UsingQueryDosDevice(CUIntArray&amp;&nbsp; ports);</strong></p>
<p><strong>Parameters</strong></p>
<p><em>ports</em> Upon return this array will contain the port numbers of all the 
serial ports installed on the computer</p>
<p><strong>Remarks</strong></p>
<p>This function uses the QueryDosDevice method of detect serial ports. Please note 
that this only works correctly on NT, Windows 2000, XP or 2003.</p>
<p>&nbsp;</p>
<p><strong>CEnumerateSerial::UsingGetDefaultCommConfig</strong></p>
<p><strong>BOOL CEnumerateSerial::UsingGetDefaultCommConfig(CUIntArray&amp;&nbsp; ports);</strong></p>
<p><strong>Parameters</strong></p>
<p><em>ports</em> Upon return this array will contain the port numbers of all the 
serial ports installed on the computer</p>
<p><strong>Remarks</strong></p>
<p>This function uses the GetDefaultCommConfig method of detect serial ports. Please 
note that this is the most compatible way of detecting serial ports and will work 
on all Win32 OS&#39;es from Windows 95 onwards but also happens to be the slowest.</p>
<p>&nbsp;</p>
<p><strong>CEnumerateSerial::UsingSetupAPI1</strong></p>
<p><strong>BOOL CEnumerateSerial::UsingSetupAPI1(CUIntArray&amp;&nbsp; ports, CStringArray&amp; 
sFriendlyNames);</strong></p>
<p><strong>Parameters</strong></p>
<p><em>ports</em> Upon return this array will contain the port numbers of all the 
serial ports installed on the computer</p>
<p><i>sFriendlyNames</i> Upon return this array will contain the Friendly names 
as appears in the Device Manager corresponding to the serial ports returned in
<i>&quot;ports&quot;</i>.</p>
<p><strong>Remarks</strong></p>
<p>This function uses the Device Manager &quot;SetupDi..&quot;&nbsp;APIs and the 
value GUID_DEVINTERFACE_COMPORT device interface class to detect serial 
ports. Please note that this will only work 
on Windows 2000 or later.</p>
<p>&nbsp;</p>
<p><strong>CEnumerateSerial::UsingSetupAPI2</strong></p>
<p><strong>BOOL CEnumerateSerial::UsingSetupAPI2(CUIntArray&amp;&nbsp; ports, CStringArray&amp; 
sFriendlyNames);</strong></p>
<p><strong>Parameters</strong></p>
<p><em>ports</em> Upon return this array will contain the port numbers of all the 
serial ports installed on the computer</p>
<p><i>sFriendlyNames</i> Upon return this array will contain the Friendly names 
as appears in the Device Manager corresponding to the serial ports returned in
<i>&quot;ports&quot;</i>.</p>
<p><strong>Remarks</strong></p>
<p>This function uses the Device Manager &quot;SetupDi..&quot;&nbsp;APIs and the 
&quot;Ports&quot; device information set to detect serial 
ports. The code of course implements logic to exclude parallel ports from the 
returned array as they are included in the &quot;Ports&quot; device information set in 
addition to serial ports. This approach will work on all Win32 OS&#39;es from 
Windows 95 onwards.</p>
<p>&nbsp;</p>
<p><strong>CEnumerateSerial::UsingEnumPorts</strong></p>
<p><strong>BOOL CEnumerateSerial::UsingEnumPorts(CUIntArray&amp;&nbsp; ports);</strong></p>
<p><strong>Parameters</strong></p>
<p><em>ports</em> Upon return this array will contain the port numbers of all the 
serial ports installed on the computer</p>
<p><strong>Remarks</strong></p>
<p>This function uses the Win32 SDK call &quot;EnumPorts&quot;&nbsp; APIs to detect serial 
ports. This will work on all Win32 OS&#39;es from Windows 95 onwards.</p>
<p>&nbsp;</p>
<p><strong>CEnumerateSerial::UsingWMI</strong></p>
<p><strong>BOOL CEnumerateSerial::UsingWMI(CUIntArray&amp;&nbsp; ports, CStringArray&amp; 
sFriendlyNames);</strong></p>
<p><strong>Parameters</strong></p>
<p><em>ports</em> Upon return this array will contain the port numbers of all the 
serial ports installed on the computer</p>
<p><i>sFriendlyNames</i> Upon return this array will contain the Friendly names 
as reported using WMI corresponding to the serial ports returned in
<i>&quot;ports&quot;</i>.</p>
<p><strong>Remarks</strong></p>
<p>This function uses the WMI COM interfaces to detect serial ports. This will only 
work on Windows NT 4 SP4, Windows 2000, XP or 2003 (i.e versions of Windows on which 
WMI is available).</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><a name="Contact"></a>Contacting the Author</h2>
<p>PJ Naughter<br>
Email: <a href="mailto:pjna@naughter.com">pjna@naughter.com</a><br>
Web: <a href="http://www.naughter.com">http://www.naughter.com</a><br>
9 June 2007</p>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -