Einbindung einer .dll in mit GCC erstelltes Programm



  • Nehmen wir an, wir hätten eine Datei x.dll . Nehmen wir weiterhin an, wir hätten eine Datei C.c, die C-Code enthält (ob ANSI oder nicht, sei einmal dahingestellt). Wie bekommt man nun sinnvollerweise die Funktionen aus x.dll in C.exe - und möglichst so, dass x.dll NICHT für die Ausführung von C.exe benötigt wird?

    Vermutung eins:
    Es braucht eine Datei x.h, in der die Signaturen der Funktionen aus x.dll verzeichnet sind.

    Vermutung zwei:
    Die Datei x.h muss in C.c importiert werden, als würde man eine Datei x.c nutzen wollen.

    Vermutung drei:
    Irgendwie muss nun noch beim Compilieren x.dll in die Programmdatei integriert werden.

    Große Frage:
    Wie lässt sich Vermutung drei umsetzen?

    (bitte keine Erklärungen für Visual C++, MinGW oder sonstige graphische Benutzeroberflächen - das Erstellen eines "Projektes" macht sich mit NoteTab nicht sonderlich gut und ist auch nicht gewünscht; darüber hinaus habe selbst ich schon entsprechende Tutorials gefunden, die mir nur leider nichts bringen)

    Nachtrag:
    Ach ja, Betriebssystem ist Windows XP Sp3.
    Ja, das heißt tatsächlich, dass MinGW vorhanden ist. Aber ich möchte es gerne so handhaben, dass ich derlei Luxus erst benutze, wenn ich weiß, wie ich es zur Not auch per Hand erledigen kann.



  • DLLs sind ja eine Windows-eigene Geschichte, weshalb du zur Verwendung schon mal die windows.h inkludieren musst. Dann kannst du sie mit LoadLibrary dynamisch einbinden, mit GetProcAddress die Funktionen (bzw. Funktionspointer) holen und mit FreeLibrary alles wieder freigeben. Wenn du nur die DLL und den Header besitzt, hast du imho keine Möglichkeit, deine Anwendung ohne die DLL weiterzugeben (korrigiert mich, wenn ich mich irre). Dazu müsstest du die passende lib (oder natürlich direkt den Source) haben.



  • naja, wenn es zu der dll eine lib gibt, dann bkannst du das weglassen.
    Dann reicht es einfach nur die lib hinzuzulinken



  • vlad_tepesch schrieb:

    naja, wenn es zu der dll eine lib gibt, dann bkannst du das weglassen.
    Dann reicht es einfach nur die lib hinzuzulinken

    ...und den Header einzubinden, damit man über's Kompilieren hinaus kommt! 😉



  • LordZsar1 schrieb:

    Wie bekommt man nun sinnvollerweise die Funktionen aus x.dll in C.exe - und möglichst so, dass x.dll NICHT für die Ausführung von C.exe benötigt wird?

    dazu müssteste die dll disassemblieren, den code dann durch einen assembler jagen, der ein zu deinem linker kompatibles object-format erzeugt, und dann alles zu einem klotz zusammenlinken. einfacher vielleicht: die dll als 'ressource' ans ende der exe anhängen. die exe extrahiert dann beim start die dll in den speicher und kann ihre funktionen aufrufen. noch einfacher vielleicht: es gibt packer, die ausführbare archive erzeugen können. beim starten entpacken die die exe und dll(s) in ein temporäres verzeichnes und starten das alles.
    🙂



  • vlad_tepesch schrieb:

    naja, wenn es zu der dll eine lib gibt, dann bkannst du das weglassen. Dann reicht es einfach nur die lib hinzuzulinken

    nicht ganz. manche 'libs' sind nur dazu da, um sich diese ganzen 'GetProcAddress' aufruf zu sparen. da braucht man trotzdem noch eine dll.
    🙂



  • ~fricky schrieb:

    nicht ganz. manche 'libs' sind nur dazu da, um sich diese ganzen 'GetProcAddress' aufruf zu sparen. da braucht man trotzdem noch eine dll.
    🙂

    ich meinte dass ganze loadLib und FreeLib kannman sich sparen, dass man die dll noch braucht, wenn man die zugehörige import bibliothek benutzt ist klar.



  • Schauen wir einmal...

    Keine der erwähnten Funktionen ist ja direkt in windows.h enthalten, aber diese enthält ja ihrerseits wieder andere...
    "LoadLibrary" stammt aus winbase.h.
    "GetProcAddress" stammt aus winbase.h ODER aus wingdi.h (Aus winbase.h, da diese vor wingdi.h steht, oder?).
    "FreeLibrary" stammt aus winbase.h.

    ... Was ist ein "LPCWSTR"? Und ein "HMODULE"? Warum nimmt "LoadLibraryW" einen "LPCWSTR" aber GetProcAddress einen "LPCSTR"? Wie kann es sein, dass "LoadLibraryW" eine "WINBASEAPI HINSTANCE WINAPI" liefert, aber "FreeLibrary" ein "HMODULE" erwartet?
    Ich hatte eigentlich als Parameter für "LoadLibraryW" ein "FILE *" aus stdio.h oder einen "char *" erwartet, aber so einfach wird die Sache wohl nicht.
    Sollte zufällig jemand ein Tutorial kennen, in dem die Sache "von Hand" vorgeführt wird, darf er auch gerne darauf verweisen.



  • LordZsar1 schrieb:

    ... Was ist ein "LPCWSTR"?

    das ist ein define oder typedef für 'const wchar_t*'

    LordZsar1 schrieb:

    Und ein "HMODULE"?

    ein 'handle' mit dem die teile eines ausführbaren programms referenziert werden (z.b. dlls) im prinzip ist's nur ein void*.

    LordZsar1 schrieb:

    Warum nimmt "LoadLibraryW" einen "LPCWSTR" aber GetProcAddress einen "LPCSTR"?

    die 'W' funktionen in windoofs arbeiten alle mit 'wchar_t*', während die 'A'-funktionen ganz normale 'char*' erwarten. unter windosen gibt es viele funktionen doppelt, also eine A und eine W version. beide machen das gleiche d.h. die A ruft die W auf aber wandelt vorher alle string-argumente nach wchar_t[].

    LordZsar1 schrieb:

    Wie kann es sein, dass "LoadLibraryW" eine "WINBASEAPI HINSTANCE WINAPI" liefert, aber "FreeLibrary" ein "HMODULE" erwartet?

    HINSTANCE und HMODULE sind das selbe. unter 16-bit wondoze gabs, glaub ich, noch einen unterschied, aber heute nicht mehr.
    WINBASEAPI und WINAPI sind defines für __stdcall und noch irgendwas anderes. die haben aber nur bei funktionen eine bedeutung.
    🙂


Anmelden zum Antworten