Problem mit der INPOUT32.DLL
-
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).