Problem mit der INPOUT32.DLL
-
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
-
Wie wär's mit inoutp test; !?
-
ok, nun kommt:
[C++ Error] Unit1.cpp(22): E2247 'inoutp::inoutp()' is not accessible
[C++ Error] Unit1.cpp(22): E2166 Destructor for 'inoutp' is not accessible
-
Ok, mein Fehler. Ändere mal die Klasse so ab
class inoutp { public: inoutp(); ~inoutp(); void pin(int Pin); private: HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; bool valid; int ipin; };
-
OK, nun geht alles bis auf das er bei der Funktion Pin Meldet das sie kein Mitglied von inoutp ist.
-
Dann schau dir nochmal deine Definition von pin an (Groß/Kleinschreibung, Scope).