几天的研究和编程使我尝试了所有的 inpout32.dll 和 inpoutx64.dll 变体:二进制文件、源代码、32 位、64 位、地址包装器。无效:端口的输出位没有变化。
但是,我知道这是可能的,因为使用另一个进行并行端口输出的商用程序,我可以通过传递 0 到 255 之间的值来检测所有八个输出位(D0-D7)上的触发(状态变化),究竟是什么我想在我自己的应用程序中做。
我至少遵循了这些页面中的所有建议:
- 在 Windows 7 中写入并行端口
- C# LPT inpout32.dll
- C# - 读取并行端口状态(简单推送开关)
- 在 Windows 7 上写入并行端口
- 使用 C# 的并行端口
- http://www.lvr.com/parport.htm
我使用的是 64 位的 Windows 7;我的 SIIG Cyberpro 端口映射为地址 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);
}
}
}