LoadLibrary mit BDS2006



  • Hallo!

    Ich habe mal wieder ein kleines Problem.

    Ich habe ein ursprünglich mit BCB 5 entwickeltes Programm, welches dynamisch einige Funktionen aus einer eigenen DLL lädt.

    Kürzlich habe ich die DLL mit dem BDS2006 compiliert und konnte diese problemlos mit dem alten BCB 5 Programm weiterbenutzen.
    Nun bin ich dabei das Hauptprogramm zu überarbeiten.
    Der Aufruf der Funktionen aus der DLL erfolgt wie folgt:

    typedef int Funktion(int);
    Funktion *pFunktion;
    //
    ...
    //
    __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
    {
    }
    //
    void __fastcall TForm1::ButtonClick(TObject *Sender)
    {
    HINSTANCE hDllInst;
    try
      {
      hDllInst=LoadLibrary("dlldatei.dll");
      if (hDllInst!=NULL)
        {
        Edit1->Text="DLL";
        pFunktion=(Funktion*)::GetProcAddress((HMODULE)hDllInst, "DllFunktion");                                                       
        (pFunktion)(5000);
        FreeLibrary(hDllInst);
        }
      else
        {
        Edit1->Text="NODLL";
        }
      }
    //
    ...
    //
    }
    

    Der Zugriff auf die DLL gelingt nicht. Das hDllInst ist nach dem LoadLibrary-Aufruf NULL.
    Ich habe den kompletten Code in ein neues Projekt kopiert und der Zugriff auf die DLL funktioniert ohne Änderungen am Programmcode.
    Die DLL-Datei befindet sich jeweils im gleichen Verzeichnis wie das Hauptprogramm und die DLL-Datei ist definitiv funktionsfähig. Sie arbeitet problemlos mit der BCB5 Version des Programmes. Der Zugriff auf die DLL erfolgt in dem Programm in der gleichen Weise abgesehen von den Hinweistexten im Edit1-Feld.

    Mir fällt keine Debugmöglichkeit ein.
    Ich vermute irgendeine Projektoption verhindert den Zugriff auf die DLL.
    Aber die Suche danach ist wie die Suche nach der Nadel im Heuhaufen.

    Hat jemand eine Idee. Vielleicht ist das Problem ja schon mal bei jemand anders aufgetreten.
    Achja, Update 2 ist installiert.

    Vielen Dank



  • mich würd' interessieren, was

    hDllInst=LoadLibrary("dlldatei.dll");
    
    if( !hDllInst ) {
    
        ::GetLastError() // <<=============
        Edit1->Text="NODLL";
    
    } else {
    
        Edit1->Text = "DLL";
        pFunktion = ( Funktion* ) ::GetProcAddress( (HMODULE)hDllInst, "DllFunktion");                                                      
            // ^ Brauchst übrigens hier nicht nach HMODULE casten denn HINSTANCE ist ein
            //   typedef für HMODULE.
        (pFunktion)( 5000 );
            // ^ musst pFunction nicht klammern
        FreeLibrary( hDllInst );
    }
    

    an dieser Stelle liefert.

    Greetz, Swordfish.



  • GetLastError() liefert "998"



  • 998 = Invalid access to memory location.=ERROR_NOACCESS



  • Die Fehlerbezeichnung war mir bekannt.
    Die verschiedenen Erklärungen und Hinweise im Internet, unter anderem bei MS fand ich nur ein wenig schwammig was die Fehlersuche ein wenig schwierig macht.
    Wie bereits gesagt, die DLL läuft mit der alten Programmversion, die an der Aufrufstelle den gleichen Code enthält perfekt.


Anmelden zum Antworten