C#调用WIN32API系列一列举可用COM端口

原创 2002年12月03日 08:52:00

 C#通过调用WIN32API可以实现非常强大的功能,本文将着重讲述如何通过调用WIN32API实现列举

所有COM端口。
 首先我们看看EnumPorts函数的定义
BOOL EnumPorts(
  LPTSTR pName,       // server name
  DWORD Level,        // information level
  LPBYTE pPorts,      // port information buffer
  DWORD cbBuf,        // size of port information buffer
  LPDWORD pcbNeeded,  // bytes received or required
  LPDWORD pcReturned  // number of ports received
);
 这个api返回信息放在pPorts所指的缓冲区中,是一个
  struct PORT_INFO_1
  {
   string pName;
  }
的结构数组。根据Level参数不同,这个结构数组有些不同。
C#要调用API首先要引入动态库,EnumPorts在winspool.drv这个动态库中。引入语句如下
[DllImport("winspool.drv", CharSet=CharSet.Auto)]
然后是定义PORT_INFO_1结构
  struct PORT_INFO_1
  {
   [MarshalAs(UnmanagedType.LPTStr)]
   public string pName;
  }
 好了,全部的源代码如下:
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace rooksoft.Demo {
 public class EnumPortDemo {
  [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
   struct PORT_INFO_1
  {
   [MarshalAs(UnmanagedType.LPTStr)]
   public string pName;
  }
       
  [DllImport("winspool.drv", CharSet=CharSet.Auto)]
  static extern bool EnumPorts(string pName, int level, IntPtr bufptr,
   int cbBuf, out int pcbNeeded, out int pcReturned);


  public EnumPortDemo()
  {
  }
  public void ListPorts()//out ArrayList portslist
  {
   int pcReturned = 0;
   int pcbNeeded = 0;
   IntPtr outb = IntPtr.Zero;
     
   EnumPorts(null, 1, outb, 0, out pcbNeeded, out pcReturned);
   outb = Marshal.AllocHGlobal(pcbNeeded+1);
   EnumPorts(null, 1, outb, pcbNeeded, out pcbNeeded, out pcReturned);
   PORT_INFO_1[] portsArray = new PORT_INFO_1[pcReturned];

   IntPtr current = outb;
   for (int i=0; i<pcReturned; i++)
   {
    portsArray[i] = (PORT_INFO_1)

Marshal.PtrToStructure(current,
     typeof(PORT_INFO_1));
    current=(IntPtr)

((int)current+Marshal.SizeOf(typeof(PORT_INFO_1)));
    Console.WriteLine(portsArray[i].pName);
   }
   Marshal.FreeHGlobal(outb);
   //return manyArr;
  }
  public static void Main() {
   EnumPortDemo demo = new EnumPortDemo();
   demo.ListPorts();
  }

 }
}
联系作者zlyperson@163.net

自动列举出电脑上可用的COM口

出处:http://blog.chinaunix.net/uid-20672257-id-2973926.html 开发工具:visual studio 2010 本机...
  • wuhenyouyuyouyu
  • wuhenyouyuyouyu
  • 2016年11月28日 14:39
  • 527

C# winform 串口通信时检测电脑可用串口并显示

单击同一个按钮实现显示“全部串口”和“可用串口”想切换 #region 全部串口和可用串口切换 private void button1_Click(object sender, ...
  • tingzhiyi
  • tingzhiyi
  • 2015年10月12日 13:51
  • 2986

Ruby调用Win32API——EnumDisplaySettings的调用

今天写了一个用Ruby调用Win32接口的程序,基础功能是枚举出当前显示设备支持的分辨率。 先上代码: require 'Win32API' class EnumDisplaySetting D...
  • di10ng
  • di10ng
  • 2015年12月28日 19:38
  • 1534

C#调用WIN32API系列二列举局网内共享打印机

C#调用WIN32API系列二列举局网内共享打印机 C#通过调用WIN32API可以实现非常强大的功能,本文将着重讲述如何通过调用WIN32API实现列举局域网络内所有共享的打印机。 首先我们看看En...
  • zlyperson
  • zlyperson
  • 2003年02月13日 09:57
  • 1437

图解C# 调用Win32 API 示例程序

先上代码;相关函数不解释;网上比较容易查到; using System; using System.Collections.Generic; using System.ComponentModel; ...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年04月21日 22:18
  • 1086

C# 使用WIN32API获取打印机

主要使用到winspool.drv中的EnumPrinters函数,代码如下:[DllImport("winspool.drv", SetLastError = true, CharSet = Cha...
  • mengyao
  • mengyao
  • 2006年11月10日 00:13
  • 2133

C#与DLL和COM的混合编程(2)-C#调用COM组件

C#调用COM组件这部分描述了在托管代码中调用COM组件的方法,现存的COM组件在托管代码中作为中间件或者独立的功能实体是很有价值的资源  向.NET Framework报露COM组件1. Impor...
  • Net_Ghost
  • Net_Ghost
  • 2006年06月17日 01:08
  • 5337

获取可用端口

///         /// 获取第一个可用的端口号        ///         ///         public static int GetFirstAvailablePort()...
  • hnpzhili
  • hnpzhili
  • 2011年03月09日 18:21
  • 4256

在C#下利用COM组件提供给第三方调用,无需强命名,通过CurrentDomain_AssemblyResolve方式的解决的过程

在C#下利用COM组件提供给第三方调用,无需强命名,通过CurrentDomain_AssemblyResolve方式的来实现,WIN7\WINXP完美测试通过...
  • QianJianLin
  • QianJianLin
  • 2015年04月02日 12:43
  • 1456

C++获取可使用的COM口列表

int iCOM; char cCom[MAX_PATH] = " "; bool bFirstTime = TRUE; for(int i = 1; i
  • cui412445112
  • cui412445112
  • 2015年12月10日 14:10
  • 840
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#调用WIN32API系列一列举可用COM端口
举报原因:
原因补充:

(最多只允许输入30个字)