Kleine *.dll schreiben



  • Hi, ich hab ein Problem und versteh nicht wirklich wie es zustande kommt.

    Ich will eine relativ kleine DLL generieren, will aber MT linken.
    Ich ignoriere: "msvrc"

    Ich verwende die std classen vector und string.

    Läuft, große DLL

    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  fdwReason,
                           LPVOID lpReserved
    )
    

    Läuft nicht (Linker bemängelt ein unresolved _main())

    EXTERN_C BOOL WINAPI _DllMainCRTStartup(
      HINSTANCE hInstDll,         // handle to the DLL module
      DWORD fdwReason,            // reason for calling function
      LPVOID lpvReserved         // reserved
    )
    

    Wäre super wenn mir jemand auf die Sprünge helfen könnte.
    Ich finde es so verwirrend dass ich durch hinzunahme der std Klassen plötzlich _main() verlangt wird .... fehlt mir da ein define? Versucht der Linker eine exe zu generieren oder was ist da genau falsch?

    (P.S: Ich hab mit tinyc libs usw. gespielt, aber eigendlich gehts mir hier nur um das Verständnis)

    Vielen Dank



  • Ich bin mir nicht sicher, aber hast du auch dem Linker mitgeteilt, das er ne Dll auspucken soll? Für mich klingt die Fehlerbeschreibung auf die schnelle nämlich so, dass dein Linker versucht ein "normales" Programm (mit Subsystem Konsole, bei Windows-Programmen würde er WinMain suchen) zu erstellen, was (laut Standard) natürlich mit der main-Fkt. beginnt.



  • Die dll muss für Windows-Anwendungen eine WinDll sein - hast du gemacht.
    Dann muss die Anwendung die dll sowie deren exportierten Funktionen geeignet importieren. Die Anwendung braucht die dll-Funktionen. Dafür gibt es mehrere Möglichkeiten. Ich erstelle mit dem DOS-Tool implib aus der dll eine Import-Bibliothek und binde diese in das Projekt der Anwendung ein. Die Anwendung muss aber auf die dll zugreifen können, am besten exe und dll im selben Ordner. Dann läuft das auch!





  • Ich hab die Frage auch richtig schlecht gestellt und dazu noch festgestellt das ich nen Fehler eingebaut hatte.

    Ich wollte mit minicrt.lib möglichst kleine *.dlls erstellen, deswegen auch direct _DllMainCRTStartup. Das extern war allerdings fehl. Und std strings, vectoren mit minicrt scheint nicht zusammen zu wollen.

    Es sind Plugins und exporten brauch ich nichts, windllmain ist schon richtig und funktioniert auch.

    Allerdings nerven mich die 52kb ... ich iteriere durchs Font Verzeichnis und speichere die Fontnames im Vector. Mehr ist nicht.


  • Mod

    Wenn Du die stl verwendest musst Du auch mit der CRT leben. Punkt!
    Der Heap und die Heapfunktionen kommen aus der CRT, die STL funktioniert noch ohne diese...



  • Martin Richter schrieb:

    Der Heap und die Heapfunktionen kommen aus der CRT, die STL funktioniert noch ohne diese...

    Naja, könnte man nicht theoretisch einen eigenen Allocator bauen?


  • Mod

    dot schrieb:

    Martin Richter schrieb:

    Der Heap und die Heapfunktionen kommen aus der CRT, die STL funktioniert noch ohne diese...

    Naja, könnte man nicht theoretisch einen eigenen Allocator bauen?

    Klar kannst Du... nur ich sehe den Sinn nicht.
    Dann fehlt Dir das Exception Handling, dass auch teilweise in der CRT mit drin liegt... und wenn es um die statischen Variablen geht, fehlt Dir der CRT Code um alles zu initialisieren, was der Compiler vorbereitet...
    52kb sind es garantiert nicht wert sich um all das den Kopf zu zerbrechen.

    Und wenn die CRT als DLL vorliegt wird deren Code auch noch mit anderen Programmen geteilt die diese auch benötigen...


Log in to reply