DLL in eine C Applikation einbinden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • DLL in eine C Applikation einbinden

    Hi,

    ich würde gerne eine DLL Datei in eine C Applikation einbinden, jedoch weiß ich nicht so recht wie, obwohl ich theoretisch eine Ahnung habe, da ich dies anderen Sprachen bereits getan habe.

    Die DLL will ich dann später extrahieren oder wenn möglich sogar als Modul verwenden.

    Würde mich sehr über eine hoffentlich hilfreiche Antwort freuen.


    Vielen Dank
    zl0h
  • Hallo,
    im Regelfall musst du die mitgelieferte Headerdatei einbinden und die lib mitlinken.
    Was du mit Dll extrahieren meinst kann ich nicht so ganz nachvollziehen.
    Was genau möchtest du denn machen?

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • Das Programm benötigt die DLL, die zur Zeit im gleichen Ordner ist.

    Nun würde ich diese DLL gerne mit einbinden und sie dann vom Programm aus extrahieren (in den gleichen Ordner schreiben) oder sie sogar als Modul benutzen.



    Habe soeben erfolglos folgendes getestet:


    In \res\:
    datei.dll
    main.rc


    Inhalt main.rc:

    Quellcode

    1. 1001 BIN "res\\datei.dll"



    In main.c:

    Quellcode

    1. #define IDR_DLL 1001
    2. (...)
    3. int main(int argc, char *argv[]) {
    4. ExtractRes("datei.dll",IDR_DLL);
    5. (...)

    und

    Quellcode

    1. char ExtractRes(char *szDest, WORD wResName)
    2. {
    3. FILE* hResFile;
    4. HRSRC hResLoad;
    5. HGLOBAL hResData;
    6. LPCSTR lpResData;
    7. char szFinalPath[MAX_PATH];
    8. hResFile = fopen(szDest,"wb");
    9. hResLoad = FindResource(NULL,MAKEINTRESOURCE(wResName),"BIN");
    10. hResData = LoadResource(NULL,hResLoad);
    11. lpResData = (LPCSTR)LockResource(hResData);
    12. if(hResLoad != NULL && hResData != NULL && lpResData != NULL)
    13. {
    14. fwrite(lpResData,1,SizeofResource(NULL,hResLoad),hResFile);
    15. fclose(hResFile);
    16. FreeResource(hResData);
    17. }
    18. return(0);
    19. }
    Alles anzeigen



    Error:
    main.c:177: error: conflicting types for 'ExtractRes'
    main.c:25: error: previous implicit declaration of 'ExtractRes' was here








    Edit:

    Und wenn ich in Dev-C++ bei "Project Options" -> "Makefile" -> "Include the following files into the MakeFile" die Datei auswähle, bekomme ich folgenden Error:

    2 ...\res\datei.dll *** missing separator. Stop.
  • Ah ja,du möchtest also eine dynamisch geladene Bibliothek statisch linken.
    Auf die Idee bin ich bislang noch überhaupt nicht gekommen.
    Was bewegt dich denn dazu?
    Unterm Strich wirst du damit wohl auch nicht viel Glück haben.
    Das Prinzip ist folgendes. In deiner exe ist ne Importtabelle wo aufgelistet ist welche Funktionen aus welchen Dll´s benötigt werden.Beim Programmstart(und das ist lange bevor deine main anläuft) werden diese Dll´s in den Adressraum deiner Anwendung eingeblendet und die Dll Mains der Dlls ausgeführt.
    Zumindest mir ist kein Weg bekannt wie du Windows mitteilen könntest dass deine Dll in deinen Resourcen schlummert.
    Sofern es die Bibliothek auch als statische Lib gibt,kannst du diese statisch linken.
    Das ist dann so ziemlich genau das was du vorhast.
    Der Microsoft Linker bietet weiterhin ne Option DELAYLOAD mit der man ne exe so hinbiegen kann dass eine Dll erst dann geladen wird wenn zum ersten mal ne Funktion aus dieser aufgerufen wird.Keine Ahnung wie dass bei deinem Compiler aussieht...

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)