2011-01-05 17 views
6

No obtengo ningún error o excepción.C# LPT inpout32.dll

botón en una ventana:

private void button1_Click(object sender, EventArgs e) 
{ 
    ControlPort.Output(0x378, 0xff); 
} 

y la interfaz inpout.dll:

class ControlPort 
{ 
    [DllImport("inpout32.dll", EntryPoint = "Out32")] 
    public static extern void Output(int adress, int value); 
} 

¿Qué le pasa? El LED en D2 está encendido todo el tiempo.

Tengo Windows 7 x64 Ultimate.

Respuesta

3

No obtendrá una excepción cuando se equivoque, como máximo con una pantalla azul. Escoja uno de:

  • está utilizando la dirección equivocada (0x3bc, 0x2f8)
  • que Wired el LED mal
  • que se rompió en el museo mal para conseguir la pregunta del hardware

está muy poco documentado para ayudarte más allá de esto.

+0

Nada de esto. La primera respuesta es correcta. Estaba usando la versión incorrecta dll. – Hooch

+0

Hmm, el uso de una DLL de 32 bits en un proceso de 64 bits siempre produce una excepción. –

5

Código de trabajo si alguien lo necesita.

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); 
      } 
     } 
    } 
} 
+0

Obtengo 'System.EntryPointNotFoundException: no se puede encontrar un punto de entrada llamado 'IsInpOutDriverOpen' en DLL 'inpoutx64.dll' cuando se intenta llamar a' IsInpOutDriverOpen_x64() '. –

+0

Ahora tienen este 'BOOL _stdcall IsXP64Bit(); \t \t \t // Devuelve TRUE si el sistema operativo es Windows 64bit (x64) 'que es parte de ambos archivos dll. – SSpoke

1

que resuelven un problema con el puerto LPT en Windows 2000 en mi viejo portátil, donde no se pudo establecer el puerto de datos (pin 2-pin9).

Con esta función importada:

[DllImport("inpout32.dll", EntryPoint = "Out32")] 
public static extern void Out32(int address, int value); 

después de cada reinicio de Windows o el reinicio de Tengo que llamar a esta línea:

Out32(0x378 + 2, 0x00); 

de manera que el puerto funciona correctamente. Creo que el problema está en la configuración bidireccional (puerto de control en el 6º bit en 0x37A).