Problem mit der INPOUT32.DLL
-
Hallo,
ich habe ein Problem mit der "INPOUT32.DLL" und zwar sieht mein Prog erstmal so aus:
//--------------------------------------------------------------------------- #include <vcl.h> #include <stdio.h> #include <windows.h> #include <iostream> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; hLib = LoadLibrary("inpout32.dll"); inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); oup32 (888, 255); } //---------------------------------------------------------------------------
Nun sagt er mir beim jeden Start:
http://img113.imageshack.us/img113/3263/unbenanntny2.png
Und Borland zeigt mir die Letzte Klammer } blau an.
Wieso?Mfg. BNS
-
Hallo,
Du solltest vielleicht mal überprüfen ob die dll und die Funktionen überhaupt erfolgreich geladen wurden.
-
Wie kann ich das machen? Ich fange grade erst mit dll's an, und habe somit noch keinerlei erfahrung und freue mich über Beispiele.
-
z.Bsp. so
hLib = LoadLibrary("inpout32.dll"); if( hlib ) { inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if( !inp32 || !oup32 ) { // Fehler, Funktionen wurden nicht gefunden } else { oup32 (888, 255); } } else { // Fehlermeldung dll konnte nicht geladen werden }
-
Ich hab es zum testen mal so gemacht, doch er zeigt an das kein Fehler vorliegt, aber trotzdem kommt weiterhin die Error Meldung.
HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; hLib = LoadLibrary("inpout32.dll"); if( hLib ) { inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if( !inp32 || !oup32 ) { Label1->Caption = "Funktion kann nicht geladen werden!"; } else { oup32 (888, 255); } } else { Label1->Caption = "DLL kann nicht geladen werden!"; }
-
Hallo
ich habe deinen Code im BCB4 getestet (unter XP)
kein FehlerMfg
Klaus
-
Hallo
Windows erlaubt solche Zugriffe auf Hardware nicht so einfach, siehe MSDN für mehr.
Jedenfalls ist das ein Problem der WinAPI. Wenn du damit weiter arbeiten willst, sag Bescheid und ich verschieb dich ins WinAPI-Forum.
Du kannst aber auch dir eine externe VCL-Komponente suchen, die das alles für dich kapselt. Siehe auch die BCB-FAQ, Abschnitt Schnittstellenbis bald
akari
-
Ich habe es nun geschafft die DLL einzubinden hier der Code:
#include <stdio.h> #include <windows.h> #include <time.h> //------------------------------------------------------------------------- typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); void lib_laden(); void pin(int Pin); void lib_schliessen(); HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; short x; int i = 0x378; //------------------------------------------------------------------------- void lib_laden () { hLib = LoadLibrary("inpout32.dll"); inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if (hLib == NULL || inp32 == NULL || oup32 == NULL) {/*** ERROR ***/} } void pin(int Pin) { switch (Pin) { case 0: (oup32)(i,0x0); break; case 1: (oup32)(i,0x1); break; case 2: (oup32)(i,0x2); break; case 3: (oup32)(i,0x4); break; case 4: (oup32)(i,0x8); break; case 5: (oup32)(i,0x10); break; case 6: (oup32)(i,0x20); break; case 7: (oup32)(i,0x40); break; case 8: (oup32)(i,0x80); break; } } void lib_schliessen() { FreeLibrary(hLib); }
Doch ich habe ein Problem das ich die DLL nicht auf anderen Forms nutzen kann dan kommt immer ein Adress Error, nur auf der main form geht es.
-
Dein Code sollte überall gehen. Wie verwendest du denn die gezeigten Funktionen und wie genau lautet denn die Fehlermeldung?
-
Also wenn ich nur die Function pin(X); benutze klappt es aber wenn ich nun oup32(888, 0); benutzen will gibt er mir das aus:
-
Kontrolliere mal den Funktionszeiger. Der scheint hier 0 zu sein. Geh einfach mal mit dem Debugger durch.
-
Hi also ich bin noch ein N00B in solchen Sachen was ist ein Funktionszeiger und wie debugg ich das?
Der Artkel in der FAQ konnt mir da nicht richtig weiterhelfen.
-
-
Ok, aber die Funktion ist ja in der DLL und das Debuggen hilf mir auch nicht weiter ich weiß ja das der Fehler kommt wenn die Funktion oup32() in einer anderen Form benutzt wird, also verstehe ich das jetzt nicht recht.
-
oup32 ist z.Bsp. hier ein Funktionszeiger und der könnte 0 sein. Deswegen solltest du den Debugger nutzen. Setze dir Breakpoints auf jeden Aufruf von oup32() und schau nach welchen Wert oup32 hat.
-
OK, also wenn ich einen Haltepunkt auf den Aufruf setze und dan mit der maus über die Funktion gehe kommt das:
oup32 = : 10001050
doch ich kann damit nichts anfangen.
-
Schau dir an was in oup32 in lib_laden steht und dann im fehlerhaften Aufruf. Sind beide Pointer unterschiedlich? Dann hast du ein Problem.
Kontrolliere ob die dll nicht schon vorher entladen wird. usw.
-
also die funktion lib_laden();
funktioniert ja auch, nur bei den funktinen oup32(); und inp32(); kommt eben der access error.Und das ist eben der Code für alles:
#include <stdio.h> #include <windows.h> #include <time.h> //------------------------------------------------------------------------- typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); void lib_laden(); void pin(int Pin); void lib_schliessen(); HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; short x; int ipin = 0x378; //------------------------------------------------------------------------- void lib_laden () { hLib = LoadLibrary("inpout32.dll"); inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if (hLib == NULL || inp32 == NULL || oup32 == NULL) {/*** ERROR ***/} } void pin(int Pin) { switch (Pin) { case 0: (oup32)(ipin,0x0); break; case 1: (oup32)(ipin,0x1); break; case 2: (oup32)(ipin,0x2); break; case 3: (oup32)(ipin,0x4); break; case 4: (oup32)(ipin,0x8); break; case 5: (oup32)(ipin,0x10); break; case 6: (oup32)(ipin,0x20); break; case 7: (oup32)(ipin,0x40); break; case 8: (oup32)(ipin,0x80); break; } } void lib_schliessen() { FreeLibrary(hLib); }
[cpp]
-
Das Problem kann schon an deinen globalen Variablen liegen. Woher weißt du ob deine Funktionspointer gültig sind. Ich würde die ganze Funktionalität in eine Klasse kapseln. Etwa so
typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); class inoutp { inoutp(); ~inoutp(); void pin(int Pin); private: HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; bool valid; int ipin; }; inoutp::inoutp() : valid(false), ipin(0x378) { hLib = LoadLibrary("inpout32.dll"); if( hlib ) { inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if (inp32 && oup32) valid = true; } } inoutp::~inoutp() { if( hlib ) FreeLibrary(hLib); } bool inoutp::pin(int Pin) { if( !valid ) return false; switch (Pin) { case 0: (oup32)(ipin,0x0); break; case 1: (oup32)(ipin,0x1); break; case 2: (oup32)(ipin,0x2); break; case 3: (oup32)(ipin,0x4); break; case 4: (oup32)(ipin,0x8); break; case 5: (oup32)(ipin,0x10); break; case 6: (oup32)(ipin,0x20); break; case 7: (oup32)(ipin,0x40); break; case 8: (oup32)(ipin,0x80); break; } return true; }
Die kann man dann einfach so verwenden.
ioutp test; if( !test.pin(1)) // Fehler
-
OK, aber wenn ich den Code:
ioutp test; test.pin(1);
kommt der Fehler:
Undifined symbol test