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.htmMit dem Beispielprogramm dazu von hier:
http://www.hytherion.com/beattidp/comput/pport.htmgeht 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...