none
c# serialport控件传递句柄给VC DLL接口的方法 RRS feed

  • 问题

  • VC DLL接口的声明里有Query(HANDLE hComm,int nUnitNo)其中第一个参数 就是串口句柄
    请教如何把C#里面的serport控件的句柄传过去
    C#里面定义 handle 应该就是指 intptr。serialport如何转成intptr??
    我查了一下,发现serialport控件没有句柄这一说,网上很多人说用creatfile的方法实现
    但是软件结构已经生成,无法改成creatfile!!
    希望各位知道解决问题的大侠给予帮助,在线等待
    var sp = new SerialPort();
                sp.PortName = "COM4";
                sp.StopBits = StopBits.One;
                sp.Parity = Parity.None;
                sp.DataBits = 8;
                sp.BaudRate = 9600;
                sp.Open();
    object stream = typeof(SerialPort).GetField("internalSerialStream", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sp);
                var handle = (SafeFileHandle)stream.GetType().GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(stream);
                IntPtr phandle = handle.DangerousGetHandle();

    这是实验的部分代码,但是获得的句柄传输给VC dll 的时候,无法送串口输出数据,可能这个获得的句柄无用

    2012年6月28日 7:45

全部回复

  • 这两个组件都不是和语言相关的,它们的接口都是独立于语言的。你既可以在VC里使用SerialPort也可以在C#里使用这个DLL——或者在VB.Net里使用两者。

    这两个组件的接口是不兼容的,SerialPort没有访问其内部通讯句柄的接口,也不会知道DLL采用何种方式初始化通讯句柄。除非组件的开发者声明了组件间的兼容性,否则你不应该把一个组件的内部实现套在另一个组件中。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年6月28日 15:03
    版主
  • 那针对我这样的需求,用serialport可以实现么?

    如何实现呢

    2012年6月29日 1:22
  • 要用serialport改写的话你得知道那个DLL都做了什么东西。你有DLL的源代码吗?


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年6月29日 11:22
    版主
  • 有啊,DLL代码都是我们写的,但是DLL的接口参数不能改。你想知道关于DLL的什么内容?

    整个流程是这样的,C#打开串口,传入串口句柄,传入要发送的内容。DLL根据发送的内容进行整合,形成协议,然后通过给过来的句柄,通过writefile,readfile的方式与硬件进行通讯。这个DLL接口是固定的,不能通过DLL里面代码去打开,关闭串口。串口的操作都是由c#实现的。

    2012年7月2日 1:32
  • 那就把串口操作的代码用SerialPort重写一遍,只要写入的数据格式相同就可以

    或者直接pinvoke这个DLL



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年7月2日 1:41
    版主