LPT unter XP-vista

OP #1130212
Lesenswert?

so nachdem ich mich dumm und fast Dä(h)mlich gesicht habe
hier ein funktionierendes DevC++ skript das
den LPT Controlregister (ausgabe) setzen kann unter winXP und unter 
Vista
PS:
 test_read_control
und system("pause")
ist in der Main ausgeklammert und sollte zuerst
getestet werden
die dll muss natürlich im suchpfad sein !!!
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <conio.h>
4
#include <windows.h>
5
/* Definitions in the build of inpout32.dll are:            */
6
/*   short _stdcall Inp32(short PortAddress);               */
7
/*   void _stdcall Out32(short PortAddress, short data);    */
8
/* prototype (function typedef) for DLL function Inp32: */
9
     typedef short (_stdcall *inpfuncPtr)(short portaddr);
10
     typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);
11
#define PPORT_BASE 0x378
12
void test_write(void);
13
void test_read_control(void);
14
/* After successful initialization, these 2 variables
15
   will contain function pointers.
16
 */
17
     inpfuncPtr inp32fp;
18
     oupfuncPtr oup32fp;
19
/* Wrapper functions for the function pointers
20
    - call these functions to perform I/O.
21
 */
22
     short  Inp32 (short portaddr)
23
     {
24
          return (inp32fp)(portaddr);
25
     }
26

27
     void  Out32 (short portaddr, short datum)
28
     {
29
          (oup32fp)(portaddr,datum);
30
     } 
31

32

33
int main(void)
34
{
35
     HINSTANCE hLib;
36

37
     short x;
38
     int i;
39

40

41
     /* Load the library */
42
     hLib = LoadLibrary("inpout32.dll");
43

44
     if (hLib == NULL) {
45
          fprintf(stderr,"LoadLibrary Failed.\n");
46
          return -1;
47
     }
48

49
     /* get the address of the function */
50

51
     inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
52

53
     if (inp32fp == NULL) {
54
          fprintf(stderr,"GetProcAddress for Inp32 Failed.\n");
55
          return -1;
56
     }
57

58

59
     oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");
60

61
     if (oup32fp == NULL) {
62
          fprintf(stderr,"GetProcAddress for Oup32 Failed.\n");
63
          return -1;
64
     }
65

66

67
/*******************************************************/
68
/** IF WE REACHED HERE, INITIALIZED SUCCESSFUL    ******/
69
/*******************************************************/
70
     //test_read_control();
71
     test_write();
72
     //test_read_control();
73
     /* finished - unload library and exit */
74
     FreeLibrary(hLib);
75
     //system("pause");
76
     return 0;
77
}
78

79
//   TEST:  Write constant to Control register)
80
void test_write(void) {
81
     short x;
82
     int i;
83
     Out32(0x37A,0xCA);     // Set Output-only again
84
}
85
//   TEST:  READ data from control
86
void test_read_control(void) {
87
     short x;
88
     int i;
89
     i=0x37A;
90
     x = 12;
91
     x = Inp32(i);
92
     printf("Port read (%04X)= %04X\n",i,x);
93
}
Persönliche Seite #1130272
Lesenswert?

Der Ansatz über LoadLibrary/GetProcAddress ist bei einem Programm, das 
sonst nichts weiteres macht, natürlich etwas aufwendig, aber bei einem 
Programm, das auch zu anderen Aufgaben genutzt werden kann, äußerst 
praktisch.

Wird die zur DLL gehörende Importlibrary verwendet (was der "einfachere" 
Weg ist), dann muss die DLL zwingend vorhanden sein, wenn das Programm 
aufgerufen wird, sonst verweigert Windows das Starten des Programmes.

Nun stelle man sich eine IDE mit integrierter ISP-Funktion vor - die 
könnte man beim Importlibrary-Ansatz nur dann nutzen, wenn die DLL auch 
da ist, selbst wenn man die ISP-Funktion gar nicht nutzen will.

Mit dem LoadLibrary/GetProcAddress-Ansatz aber kann die IDE eine 
differenzierte Fehlermeldung ausgeben und sonst aber weiter 
funktionieren.

Somit ist das ein löbliches Codebeispiel. Chapeau!
Gast #1205453
Lesenswert?

.. bei mir läuft unter Win2K original Test-Programm über DEV-C ohne 
Einschränkungen. Habe nunmehr das (!! entscheidende !!) Problem, daß an 
der Druckerschnitstelle (0x378 -> Datenregister) keine entsprechenden 
Spannungen meßbar sind. Im BIOS waren Modi beim Testen der 
Druckerschnitstelle  <NORMAL> und <bidirektional>.
Kann mir da Jemand weiterhelfen ?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren