Announcement

Collapse
No announcement yet.

DLL dynmaisch einbinden (Delphi like)

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

  • DLL dynmaisch einbinden (Delphi like)

    Hallo zusammen,

    ich muss aus technischen Gründen von Delphi auf C++ umsteigen aber ich brauche einige meiner DLLs. In Delphi habe ich die DLL eingebunden, indem ich den Handle der DLL geholt habe und dann mit Hilfe von GetProcAddress die Adresse der Procedure auf eine Variable zugewiesen haben, die von einer TProcedure abstammt.

    In C++ geht es solange gut bis ich die Adresse zuweisen will. Mein Programm ruft die Hauptprozedur der DLL auf, aber ich komme nicht in die exportierten Prozeduren. Seht euch mal bitte meinen Code an:
    <B><PRE>
    void *hModule;
    void *Farproc;
    void Runner();

    hModule = LoadLibrary("Project2.DLL");
    Farproc = GetProcAddress(hModule,"RMAVerwaltung");
    &Runner = Farproc; </B> <--- Hier tritt der Fehler aus <B>
    Runner();
    FreeLibrary(hModule);
    <PRE></B>

  • #2
    M.E. sind die Typen void etwas ungünstig.

    Vielleicht hilft das:

    http://home.snafu.de/christian.marquardt/tutorials.8/8_dll.htm
    Christian

    Comment


    • #3
      Hi Klaus,

      void Runner(); ist doch nur eine Prototypendeklaration. Du kannst dann doch nicht die Zuweisung "&Runner = " angeben. Das dürfte eigentlich schon der Compiler anmeckern. Es sei denn du hast auch noch irgendwo eine Dummyfunktion mit Namen Runner in deinem Programm.

      Du mußt einen pointer vom Typ void (*Runner)(void) deklarieren. Dem kannst du natürlich eine Adresse zuweisen und dann Runner() aufrufen.

      Bye - Pete

      Comment


      • #4
        Moin moin,

        mittlerweile bin ich schon soweit, geht aber immer noch nicht. Ich kann Runner keine Adresse zuweisen. Wer kann helfen?
        <PRE>
        void *Runner(void);

        HINSTANCE hModule = LoadLibrary("Project2.DLL");
        &Runner = GetProcAddress(hModule,"Drinn"); <--- L value required
        Runner();
        FreeLibrary(hModule);
        </PRE&gt

        Comment


        • #5
          Hallo,
          gestern habe ich hier unter dem Betreff "Test eines VC-Quellcodes mit Borland Builder C++" einen Beitrag gepostet, worin ich darum bitte, 2 mit VC++ 6.0 entwickelte Quellcodes unter Borland Builder zu testen. Dabei geht es um die dynamische Einbindung einer von mir entwickelten DLL. Bisher hat sich keiner bei mir gemeldet, der so nett ist. Wer sich also erbarmt, bekommt gleichzeitig ein schönes Beispiel zur dynamischen Einbindung von DLL's.
          Eine kurze eMail an mich, und ich schicke die 50 kB (Quellcode und die DLL [mathem. Formelparser]).
          [email protected]

          Gruß
          Norber

          Comment


          • #6
            Norbert:
            Weil dir keiner hilft (oder helfen kann), hilfst du auch keinem

            schöne Ansicht!

            Versuch es mal mit
            Runner = GetProcAddress(hModule,"Drinn")
            Christian

            Comment


            • #7
              Ich habe die Lösung gefunden:

              <PRE>
              typedef void __stdcall RUNNER();
              RUNNER* Runner;

              HINSTANCE hModule = LoadLibrary("Project2.DLL");
              Runner = (RUNNER*) GetProcAddress(hModule,"Drinn
              Runner();
              FreeLibrary(hModule);
              </PRE&gt

              Comment


              • #8
                Schö
                Christian

                Comment


                • #9
                  Hallo Christian,

                  also so wollte ich nicht verstanden werden, und so habe ich mich auch nicht ausgedrückt.
                  Ich bin absoluter C-Neuling und habe sicher weniger Ahnung als die meisten der hier Mitlesenden. Ich konnte die Frage von Klaus nicht direkt beantworten. Aber ich hatte es mit einem Aufwand von ca. 14 Tagen durch das Studium mehrerer Bücher und unzähligem Probieren geschafft, meine Nicht-C-DLL durch einen VC++ Projekt dynamisch zu linken. Klaus hatte nun ein gleichgelagertes Problem. Da ich wissen möchte, ob mein C-Quellcode auch mit dem Builder funktioniert - was liegt da näher, als Klaus meinen Quellcode zum testen zu geben. Dabei kann er wahrscheinlich auch für sich eine Lösung finden.
                  Und so schlecht kann das Angebot nicht gewesen sein, sonst hätte sich Klaus nicht bei mir gemeldet. Wenn er jetzt verkünden konnte "ich habe die Lösung gefunden" und Du das mit "schön" kommentieren konntest, dann ist das dem Umstand geschuldet, daß ich Klaus gestern meinen Quelltext gesendet habe.

                  MfG
                  Norber

                  Comment


                  • #10
                    Guten Morgen mitnand,

                    ich habe noch eine Frage wegen der Einbindung. Ich verstehen den Sinn vom Runner = (RUNNER*) GetProcAddress nicht so richtig. Wozu ist das (RUNNER*) gut

                    Comment


                    • #11
                      Das Ergebnis der Funktion GetProcAddress wird umgewandelt zu eine Typ von Runner* (Typecasting)
                      Christian

                      Comment

                      Working...
                      X