LPT unter Windows XP ansteuern



  • Hallo,
    ich muss ein Programm machen, mit dem ich die LPT-Schnittstelle unter Windows XP ansteuern kann. Das das seit Windows NT nicht mehr ohne Umwege geht habe ich schon gelesen und deswegen habe ich mir das hier mal angeschaut:
    http://www.logix4u.net/inpout32.htm

    Mit dem Beispielprogramm dazu von hier:
    http://www.hytherion.com/beattidp/comput/pport.htm

    geht es aber nicht.

    Ich habe das Programm in eine GUI-Anwendung umgeschrieben. Hier der Code:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    
    #define PPORT_BASE 0x378
    
    #include "LPT_GUI_U.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    // Funktionsprototypen
    typedef short (_stdcall *inpfuncPtr)(short portaddr);
    typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);
    
    // Pointer
    inpfuncPtr inp32fp;
    oupfuncPtr oup32fp;
    
    // Wrapper-Funktionen
    short Inp32(short portaddr)
    {
      return (inp32fp)(portaddr);
    }
    
    void Out32(short portaddr, short datum)
    {
      (oup32fp)(portaddr,datum);
    }
    
    bool fehler = false;
    
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::btBeendenClick(TObject *Sender)
    {
      Close();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::btSchreibenClick(TObject *Sender)
    {
      /*short signal = StrToInt(edSchreiben->Text);
      int port;
    
      port = PPORT_BASE;
    
      // Datenregister schreiben
      Out32(port,signal);
      lbAusgabe->Items->Add("Schreibe: " + IntToStr(signal));
    
      // Zur Überprüfung lesen
      signal = Inp32(port);
      lbAusgabe->Items->Add("Lese: " + IntToStr(signal));
      lbAusgabe->Items->Add("--------------------");*/
    
      unsigned long NumBytesWritten; 
    unsigned char Data = 0x00; 
    
    HANDLE Lpt1Han = CreateFile("\\\\.\\LPT1", 
                                 GENERIC_WRITE, 
                                 0, 
                                 NULL, 
                                 OPEN_EXISTING, 
                                 0, 
                                 NULL); 
      if (Lpt1Han) 
      { 
        WriteFile(Lpt1Han, &Data, 1, &NumBytesWritten, NULL); 
        CloseHandle(Lpt1Han); 
      } 
      else 
        MessageDlg("Konnte LPT1 nicht öffnen",mtError, TMsgDlgButtons()<< mbOK,0);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      // DLL laden
      HINSTANCE hLib = LoadLibrary("inpout32.dll");
      if(hLib == NULL)
      {
        lbAusgabe->Items->Add("Fehler beim Laden der DLL");
        fehler = true;
      }
      else lbAusgabe->Items->Add("DLL erfolgreich geladen");
      lbAusgabe->Items->Add("--------------------");
    
      // Prozessadressen laden
      inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
      if(inp32fp == NULL)
      {
        lbAusgabe->Items->Add("Fehler beim Laden der Input-Prozessadresse");
        fehler = true;
      }
      oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");
      if(oup32fp == NULL)
      {
        lbAusgabe->Items->Add("Fehler beim Laden der Output-Prozessadresse");
        fehler = true;
      }
      if(!fehler) lbAusgabe->Items->Add("Prozessadressen erfolgreich geladen");
      lbAusgabe->Items->Add("--------------------");
    
      // Port-Adresse ausgeben
      lbAusgabe->Items->Add("Port-Adresse: " + IntToStr(PPORT_BASE));
      lbAusgabe->Items->Add("--------------------");
    
      // Initialisierung testen
      if(!fehler) lbAusgabe->Items->Add("Initialisierung ergfolgreich");
      else lbAusgabe->Items->Add("Initialisierung nicht ergfolgreich");
      lbAusgabe->Items->Add("--------------------");
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::btReadClick(TObject *Sender)
    {
      short signal;
      int port;
    
       for(port=PPORT_BASE; (port<(PPORT_BASE+8)); port++) {
            signal = Inp32(port);
            lbAusgabe->Items->Add("Lese: " + IntToStr(signal));
       }
       lbAusgabe->Items->Add("--------------------");
    }
    //---------------------------------------------------------------------------
    

    Mit der Original-Funktion von der Seite ging es auch nicht und dementsprechend damit auch nicht, obwohl die DLL im Projektverzeichnis liegt. (Ist das nicht der Fall zeigt er auch Fehler an)
    Die Pins 2 - 9 stehen (nachgemessen) immer alle auf logisch 1 - was er beim lesen über die Dezimalzahl 255 auch anzeigt - aber nach dem schreiben ändert sich das nicht.

    Was mache ich falsch?

    P.S.: Wenn ich den Code im btWrite durch den in der FAQ ersetze geht es auch nicht.



  • Mir ist gerade aufgefallen, dass in meinem Gerätemanager der LPT gar nicht angezeigt wird. Kann es damit was zu tun haben? Wieso wird er da nicht angezeigt?



  • Ich Idiot 😉

    Es ging nur nicht, weil ich vor Monaten mal den LPT im BIOS deaktiviert habe, weil ich dachte ich brauche ihn nicht ...

    Jetzt gehts 😃



  • Im BIOS deaktiviert?
    //Edit: zu langsam, aber korrekte Vermutung. Ich bin soooo gut...


Anmelden zum Antworten