1

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

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

我至少遵循了这些页面中的所有建议:

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

我知道最好不要尝试在 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);
        }
    }
}
4

1 回答 1

1

供参考:

当我添加

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

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

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

于 2013-06-03T22:36:53.107 回答