Announcement

Collapse
No announcement yet.

Wie verwende ich DLLs im C++ Builder

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie verwende ich DLLs im C++ Builder

    Ich möchte die mySQL-DLL libmySQL.dll im Borland C++-Builder einbinden. Im Source habe ich folgende Zeilen eingegeben:

    LoadLibrary( "libmySQL.dll" );

    Beim Ausführen der EXE kommt folgende Meldung:
    LDR: Automatic DLL Relocation in Project1.exe
    LDR: Dll libmySQL.dll base 10000000 relocated due to collision with C:\WINNT\System32\SBXCMDRT.DLL

    Füge ich die Zeile folgende Zeile hinzu:

    mysql_init(MYSQL *mysql);

    kommt folgende Compiler-Meldung: "Call to undefined function 'mysql_init'"

    Was mache ich falsch?

  • #2
    Mit LoadLibrary( "libmySQL.dll" ) wird die DLL dynamisch geladen. Das bedeutet, dieses darf nicht vorher durch das Programm geladen worden sein.

    Die Funktion LoadLibary gibt auch ein Objekt von Typ HINSTANCE zurück das dann für GetProcAddress benötigt wird.

    Wenn du eine DLL dynamisch lädtst, mußt du erst mit GetProcAddress die Adresse deiner Funktion ermitteln.

    Ich vermute du hast die DLL schon in dein Projekt eingebunden??

    Christia
    Christian

    Comment


    • #3
      Hoi Christian

      Vielen Dank für die Antwort. Ich hab's soweit hingekriegt, dass der Compiler nicht mehr meckert, allerdings kommt jetzt eine Speicherschutzverletzung.

      Ich hab's jetzt anderst versucht, indem ich in der .mak-Datei die DLL eingebunden habe, d.h. ich habe eine .lib erstellt und dort die *.dll eingebunden.

      Beim Compilieren kennt er die Funktion jedoch nicht.
      Hier der Eintrag in der .mak:
      ALLLIB = $(LIBFILES) vcl.lib import32.lib cp32mt.lib mySQL.lib

      Dann habe ich gelesen, dass im C++ - Quelltext folgender Eintrag notwendig sei:
      __declspec(dllimport) void mysql_init();

      Der Compiler meckert jetzt mit Expression syntax.

      Weisst du Rat

      Comment


      • #4
        Ich benutze eine Headerdatei sowohl für die DLL als auch für das Projekt.

        Die sieht im Kopf wie folgt aus:

        #ifdef __DLL__

        # define DLL_EXP __declspec(dllexport)

        #else

        # define DLL_EXP __declspec(dllimport)

        #endif

        Also die Funktion muß in der DLL zu export gekennzeichnet sein.

        Das erledigt die Zeile

        define DLL_EXP __declspec(dllexport)

        Die Definition einer Klasse sieht dann so aus:

        class DLL_EXP GFileSearch

        Wenn du eine LIB erstellt hast solltest du nicht an der MAKE-Datei rumbasteln (da habe ich mir mal jede Menge Ärger mit gemacht) sondern diese über "Projekt->Dem Projekt hinzufügen" einbinden. Das ist besser.

        Bei mir stehen die LIB's dann unter:
        LIBFILES = ..\Lib\CHFileSearch.lib

        Christia
        Christian

        Comment

        Working...
        X