inpout32.dll/inpoutx64.dll处理所有并行端口的I/O吗?

本文关键字:dll inpoutx64 处理 inpout32 并行端口 | 更新日期: 2023-09-27 18:16:14

几天的研究和编程使我尝试了inpout32.dll和inpoutx64.dll的所有变体:二进制文件、源代码、32位、64位、地址包装器。None work:端口的输出位没有变化。

然而,我知道这是可能的,因为使用另一个商业上可用的并行端口输出程序,我可以通过传递0到255之间的值来检测所有8个输出位(D0-D7)上的触发器(状态变化),这正是我想在我自己的应用程序中做的。

我已经遵循了至少这几页的所有建议:

  • 在Windows 7中写入并口
  • c# LPT inpout32.dll
  • c# -读取并行端口状态(简单Push Switch)
  • 写入windows 7的并口
  • c#的并行端口
  • http://www.lvr.com/parport.htm

我使用Windows 7, 64位;我的SIIG Cyberpro端口在地址0xCCD8上映射为LPT3,在地址0xCCD4上有四个状态位。我有另一个ECP打印机端口映射为LPT1在0x0378,但这也不起作用。

我知道最好不要在Win7上直接调用_inp(), _outp()。

有人能帮忙吗?

如果我需要下载和修改驱动程序代码,如果我不得不这样做,我可以这样做,但我认为这应该不是那么困难。

我的最终版本的代码使用32位编译,接口inpout32.dll:

using System;
using System.Runtime.InteropServices;
namespace ParallelPort
{
    public class PortAccess
    {
        //inpout.dll
        [DllImport("inpout32.dll")]
        private static extern void Out32(ushort PortAddress, short Data);
        [DllImport("inpout32.dll")]
        private static extern short Inp32(ushort PortAddress);
        private ushort _PortAddress = 0;
        public ushort PortAddress { get { return _PortAddress; } }
        public PortAccess(ushort portAddress)
        {
            _PortAddress = portAddress;
            short result = 0;
            try
            {
                result = Inp32(portAddress);
            }
            catch (DllNotFoundException e)
            {
                throw new ArgumentException("Unable to find InpOut32.dll");
            }
            catch (BadImageFormatException)
            {
                result = 0;
            }
            if (0 == result)
                throw new ArgumentException("Unable to open parallel port driver");
        }
        //Public Methods
        public void Write(ushort Data)
        {
            Out32(_PortAddress, (short)Data);
        }
        public byte Read()
        {
            return (byte)Inp32(_PortAddress);
        }
    }
}

inpout32.dll/inpoutx64.dll处理所有并行端口的I/O吗?

供参考:

添加

 [DllImport("inpout32.dll")]
 private static extern void DlPortWritePortUshort(ushort PortAddress, ushort Data);

并调用该函数而不是Out32(ushort addr, ushort value),代码有效。

我不知道为什么确切的界面很重要,但它确实很重要;也许这确实是因为16位端口地址的符号扩展,如建议的[待定]。