可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I don't get any error or exception.
Button in one Window:
private void button1_Click(object sender, EventArgs e) { ControlPort.Output(0x378, 0xff); }
and inpout.dll interface:
class ControlPort { [DllImport("inpout32.dll", EntryPoint = "Out32")] public static extern void Output(int adress, int value); }
What is wrong? LED on D2 is on all the time.
I have Windows 7 x64 Ultimate.
回答1:
For x64 you should use "InpOutx64.dll".
Visit: http://www.highrez.co.uk/Downloads/InpOut32/default.htm There you can read more and find samples.
回答2:
Working code if somebody needs it.
using System; using System.Runtime.InteropServices; namespace ParallelPort { public class PortAccess { //inpout.dll [DllImport("inpout32.dll")] private static extern UInt32 IsInpOutDriverOpen(); [DllImport("inpout32.dll")] private static extern void Out32(short PortAddress, short Data); [DllImport("inpout32.dll")] private static extern char Inp32(short PortAddress); [DllImport("inpout32.dll")] private static extern void DlPortWritePortUshort(short PortAddress, ushort Data); [DllImport("inpout32.dll")] private static extern ushort DlPortReadPortUshort(short PortAddress); [DllImport("inpout32.dll")] private static extern void DlPortWritePortUlong(int PortAddress, uint Data); [DllImport("inpout32.dll")] private static extern uint DlPortReadPortUlong(int PortAddress); [DllImport("inpoutx64.dll")] private static extern bool GetPhysLong(ref int PortAddress, ref uint Data); [DllImport("inpoutx64.dll")] private static extern bool SetPhysLong(ref int PortAddress, ref uint Data); //inpoutx64.dll [DllImport("inpoutx64.dll", EntryPoint = "IsInpOutDriverOpen")] private static extern UInt32 IsInpOutDriverOpen_x64(); [DllImport("inpoutx64.dll", EntryPoint = "Out32")] private static extern void Out32_x64(short PortAddress, short Data); [DllImport("inpoutx64.dll", EntryPoint = "Inp32")] private static extern char Inp32_x64(short PortAddress); [DllImport("inpoutx64.dll", EntryPoint = "DlPortWritePortUshort")] private static extern void DlPortWritePortUshort_x64(short PortAddress, ushort Data); [DllImport("inpoutx64.dll", EntryPoint = "DlPortReadPortUshort")] private static extern ushort DlPortReadPortUshort_x64(short PortAddress); [DllImport("inpoutx64.dll", EntryPoint = "DlPortWritePortUlong")] private static extern void DlPortWritePortUlong_x64(int PortAddress, uint Data); [DllImport("inpoutx64.dll", EntryPoint = "DlPortReadPortUlong")] private static extern uint DlPortReadPortUlong_x64(int PortAddress); [DllImport("inpoutx64.dll", EntryPoint = "GetPhysLong")] private static extern bool GetPhysLong_x64(ref int PortAddress, ref uint Data); [DllImport("inpoutx64.dll", EntryPoint = "SetPhysLong")] private static extern bool SetPhysLong_x64(ref int PortAddress, ref uint Data); private bool _X64; private short _PortAddress; public PortAccess(short PortAddress) { _X64 = false; _PortAddress = PortAddress; try { uint nResult = 0; try { nResult = IsInpOutDriverOpen(); } catch (BadImageFormatException) { nResult = IsInpOutDriverOpen_x64(); if (nResult != 0) _X64 = true; } if (nResult == 0) { throw new ArgumentException("Unable to open InpOut32 driver"); } } catch (DllNotFoundException) { throw new ArgumentException("Unable to find InpOut32.dll"); } } //Public Methods public void Write(short Data) { if (_X64) { Out32_x64(_PortAddress, Data); } else { Out32(_PortAddress, Data); } } public byte Read() { if (_X64) { return (byte)Inp32_x64(_PortAddress); } else { return (byte)Inp32(_PortAddress); } } } }
回答3:
You are not going to get an exception when you get this wrong, at most a blue screen. Pick one of:
- you are using the wrong address (0x3bc, 0x2f8)
- you wired the LED wrong
- you broke into the wrong museum to get the hardware
The question is too poorly documented to help you beyond this.
回答4:
I resolved a problem with LPT port on Windows 2000 on my old laptop, where the data port (pin2-pin9) could not be set.
Using this imported function:
[DllImport("inpout32.dll", EntryPoint = "Out32")] public static extern void Out32(int address, int value);
after every reboot or restart of Windows I have to call this line:
Out32(0x378 + 2, 0x00);
so that the port works properly. I think the problem is in the bi-directional settings (control port at 6th bit on 0x37A).