Funktion mit Feld auf dll



  • Hi,

    ich habe eine h datei in der funktionen für eine dll enthalten sind. Da die lib datei nicht zu borland kompatible ist, habe ich die funktionen dirket aus der dll gezogen.

    in der h datei stand folgende Funktion:

    void BPM_Register(int code[10]);
    

    zum Auslesen aus der dll hab ich daraus folgendes gemacht:

    void BPM_Register(int code[10])
    {
       HINSTANCE hInstance;
       typedef void (DLLFUNCTION1)(int);
       DLLFUNCTION1   *pDllFunction1;
       hInstance = ::LoadLibrary("bpmDetect.dll");
       pDllFunction1  = (DLLFUNCTION1*)::GetProcAddress((HMODULE)hInstance, "BPM_Register");  // Aufruf aus .def Datei
    
       if(pDllFunction1)
            (*pDllFunction1)(code[10]);
    
    }
    

    wenn ich die funktion jetzt aufrufe bekomm ich einen EAccessViolation Fehler.

    sieht einer von euch wo der fehler sein könnte??

    Ach, der Aufruf sieht so aus:

    int code[10]={10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
    BPM_Register(code);
    


  • Prüf als erstes nach, ob GetProcAddress einen Nullzeiger zurückliefert. In diesen Fall konnte die funktion in der DLL nicht gefunden werden.

    Ev. hilft auch:

    extern "C"
    { 
      typedef void (DLLFUNCTION1)(int);
    }
    


  • JBOpael schrieb:

    Da die lib datei nicht zu borland kompatible ist

    -> coff2omf oder implib verwenden



  • Hallo

    Unabhängig davon ob die Funktion in der DLL richtig exportiert wurde und vom Programm richtig importiert werden konnte, wundere ich mich das der gezeigte Code überhaupt kompiliert. Denn spätestens in der letzten Zeile kommt ein Konvertierungsfehler, weil das syntaktisch schon falsch ist.
    Hier eine syntaktisch korrigierte Version

    HINSTANCE hInstance;
       typedef void (*DLLFUNCTION1)(int); // Richtige Definition eines Funktionspointertypes
       DLLFUNCTION1   pDllFunction1; // Kein Sternchen notwendig
       hInstance = ::LoadLibrary("bpmDetect.dll");
       pDllFunction1  = (DLLFUNCTION1)::GetProcAddress((HMODULE)hInstance, "BPM_Register");  // Kein Sternchen notwendig
    
       if(pDllFunction1)
            pDllFunction1(code); // Richtiger Aufruf mit richtigem Argument
    

    bis bald
    akari



  • Welche Signatur hat die Funktion in der dll überhaupt?
    void BPM_Register(int code[10]);
    oder
    void BPM_Register(int code);
    Weiterhin hattest du hier

    if(pDllFunction1) (*pDllFunction1)(code[10]);
    

    neben dem von akari schon erwähnten Fehler noch das Problem, dass du auf ein ungültiges Arrayelement zugreifen wolltest. code ist ein int[10], kann also 10 ints enthalten. Mit code[10] willst du aber auf das 11te Element zugreifen.


Anmelden zum Antworten