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).


Anmelden zum Antworten