Funktionsnamen in DLLs?



  • Hallo,

    ich habe eine DLL mit Funktionen geschrieben und möchte diese dynamisch einbinden:

    DLL.cpp

    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    
    extern "C" __declspec(dllexport) void showForm()
    {
     TForm2* Form2 = new TForm2(NULL);
    
     Form2->Edit1->Parent = Form2;
     Form2->Button1->Parent = Form2;
    
     Form2->Show();
    }
    
    extern "C" __declspec(dllexport) void test()
    {
     ShowMessage("TEST");
    }
    

    Schnittstellenheader.h(Unit3.h)

    #ifndef Unit3H
    #define Unit3H
    #include <windows>
    using namespace std;
    void ShowIt()
    {
     typedef void(__stdcall *pFunc)();
     pFunc DLLFUNCTION;
     HINSTANCE h = LoadLibrary("Project2.dll");
    
     if(h)
        {
         DLLFUNCTION = (pFunc)GetProcAddress(h,"test");
         if(DLLFUNCTION)
          DLLFUNCTION();
         else  {}
          ShowMessage("Funktion existiert nicht");
        }
     else{}
      ShowMessage("DLL konnte nicht geladen werden");
    }
    //---------------------------------------------------------------------------
    #endif
    

    Ausführendes Programm

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Main.h"
    #include "Unit3.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    ShowIt();       
    }
    //---------------------------------------------------------------------------
    

    beim ausführen wird immer gesagt, das Funktion nicht existiert!Wieso?



  • Erstens sind die Klammern {} hinter den beiden else-Anweisungen überflüssig. Das ist eine NOOP-Anweisung und beendet das if-else - mit dem Ergebnis, daß die anschließenden ShowMessage()-Aufrufe nach dem if() ausgeführt werden, egal wie der Test ausgegangen ist.

    Zweitens: Kommt denn nur die "Nicht gefunden" Meldung oder kommen zwei Nachrichten "TEST" und "Funktion nicht gefunden"? (im ersteren Fall solltest du dich etwas mit Name Mangling beschäftigen, im letzteren Fall lag es tatsächlich an den überflüssigen Klammern)



  • Hallo

    Durch extern C wird der Funktionsname mit einem "_" erweitert

    DLLFUNCTION = (pFunc)GetProcAddress(h,"_test");
    

    bis bald
    akari



  • ja die klammern habe ich behoben, und den habe es in "__test" geändert!

    Es kommt immernoch NUR die Meldung, das die Funktion nicht existiert!



  • Hallo

    ich meinte "_test", nicht "__test"

    bis bald
    akari



  • ah danke akari, das wars! War von den beiden unterstrichen irgendwie geblendet 😉

    Ein frage habe ich trotzdem noch: Gibt es bei der funktion, welches die form anzeigt irgendwelche speicherlöcher beim schließen der form? oder wird hier der speicher ordentlich aufgeräumt?



  • Hallo

    Ja, so wie es jetzt da steht, gibt es ein Speicherloch. Da du manuell new aufrufst und nichts als Owner übergibst, mus auch manuell delete aufgerufen werden.
    Das würde bei einem modalen Form noch sehr einfach gehen, bei deinem nichtmodalen aber geht das nicht so einfach.
    Am einfachsten ist es für dich, bei dem TForm2 noch den Event OnClose zu benutzen, um dort dem Action-Parameter den Wert caFree zu übergeben. So wird automatisch bei jedem Schließen des Fensters die Instanz sauber gelöscht.

    bis bald
    akari


Anmelden zum Antworten