数日間の調査とプログラミングの結果、バイナリ、ソース コード、32 ビット、64 ビット、アドレス ラッパーなど、inpout32.dll と inpoutx64.dll のすべての亜種を試すようになりました。None work: ポートの出力ビットに変化は見られません。
ただし、パラレル ポート出力を行う市販の別のプログラムを使用すると、0 ~ 255 の値を渡すことで 8 つの出力ビット (D0 ~ D7) すべてでトリガー (状態変化) を検出できるため、可能であることはわかっています。私は自分のアプリケーションでやりたい。
少なくとも次のページのすべてのアドバイスに従いました。
- Windows 7 でパラレル ポートに書き込む
- C# LPT input32.dll
- C# - パラレル ポートの状態を読み取る (単純なプッシュ スイッチ)
- Windows 7 でパラレル ポートに書き込む
- C# によるパラレル ポート
- http://www.lvr.com/parport.htm
Windows 7、64 ビットを使用しています。また、私の SIIG Cyberpro ポートは、アドレス 0xCCD8 に LPT3 としてマップされ、アドレス 0xCCD4 に 4 つのステータス ビットがあります。0x0378 で LPT1 としてマップされた別の ECP プリンター ポートがありますが、それも機能しません。
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);
}
}
}