DllMain in Programm einbinden ohne weitere Bibliotheks-Funktion



  • Du weißt schon dass LoadLibraryA DllMain auch aufruft ?

    Das sollte ich vielleicht noch erwähnen. Die DLL-Datei soll statisch geladen werden, daher ist auch kein LoadLibraryA-Aufruf im Quellcode enthalten.

    @Swordfish:
    Was ist an meinem Problem unverständlich?



  • DarkShadow44 schrieb:

    Was willst du letztlich erreichen und warum ?

    Dies. Ich verstehe immer noch nicht, was für ein Problem du denn jetzt lösen möchtest.

    Nur so am Rande: Was sollen eigentlich die \0 am Ende der Stringliterale?



  • Das Problem ist die Einbindung der DllMain.
    Hauptsächlich geht es mir zur Zeit darum, dass ich ein eigenes Steuerelement (WNDCLASS) erstelle, welches per DLL-Datei eingebunden wird. Wie z.B. Microsoft das Steuerelement "Button" mit der CreateWindow-Funktion erzeugt möchte ich anstatt des Buttons ein eigenes Steuerelement einbinden.

    Beispiel:
    CreateWindow(TEXT("button"), NULL, WS_CHILD | WS_VISIBLE | BS_ICON | BS_FLAT | BS_PUSHBUTTON, 0, 0, 0, 0, hWndParent, NULL, hInstance, NULL);

    CreateWindow(TEXT("EigeneSteuerelement"), NULL, WS_CHILD | WS_VISIBLE | BS_ICON | BS_FLAT | BS_PUSHBUTTON, 0, 0, 0, 0, hWndParent, NULL, hInstance, NULL);

    Das "EigeneSteuerelement" soll in dieser DllMain registriert usw. werden.
    Ein anderer Ansatz könnte eventuell auch helfen, jedoch soll er nicht von der Anwendung des oben gezeigten Beispiels abweichen.

    Nur so am Rande: Was sollen eigentlich die \0 am Ende der Stringliterale?

    Das nennt sich Nullterminierung und soll das String-Ende anzeigen.



  • REXPILS schrieb:

    Das "EigeneSteuerelement" soll in dieser DllMain registriert usw. werden.

    Was heißt "registriert werden" und wozu?

    REXPILS schrieb:

    Nur so am Rande: Was sollen eigentlich die \0 am Ende der Stringliterale?

    Das nennt sich Nullterminierung und soll das String-Ende anzeigen.

    Möchtest du nicht vielleicht vor der WinAPI und DLLs DIE SPRACHE AN SICH LERNEN!?



  • REXPILS schrieb:

    Das "EigeneSteuerelement" soll in dieser DllMain registriert usw. werden.

    Mal davon abgesehen, dass ich im Moment nicht ganz sicher weiß, ob man das überhaupt in DllMain machen darf (wahrscheinlich aber schon), schreibe doch lieber RegisterEigeneSteuerelement und vielleicht auch UnregisterEigeneSteuerelement . Exportiere sie und rufe sie dann in der EXE auf. So einfach könnte das sein.

    Warum muss das bei dir so kompliziert sein?



  • Swordfish schrieb:

    REXPILS schrieb:

    Das "EigeneSteuerelement" soll in dieser DllMain registriert usw. werden.

    Was heißt "registriert werden" und wozu?

    Meine Güte, wie merkbefreit bist Du denn? Er meint natürlich RegisterClass/Ex. Das funktioniert aber nicht in DllMain, da diese Funktionen aus user32.dll und nicht aus kernel32.dll stammen.

    Also eigene Initialisierungs-Funktion bauen, wie EinGast bereits sagte.



  • Mox schrieb:

    Swordfish schrieb:

    REXPILS schrieb:

    Das "EigeneSteuerelement" soll in dieser DllMain registriert usw. werden.

    Was heißt "registriert werden" und wozu?

    Er meint natürlich RegisterClass/Ex. Das funktioniert aber nicht in DllMain, da diese Funktionen aus user32.dll und nicht aus kernel32.dll stammen.

    Es funktioniert nicht zuverlässig.
    Das Problem ist nur dass es meistens doch funktioniert. Gerade im Fall von USER32 Funktionen, weil die USER32 meist schon geladen & initialisiert ist wenn die DllMain von eigenen DLLs läuft.

    EinGast schrieb:

    Warum muss das bei dir so kompliziert sein?

    Das frag' ich mich auch oft.



  • hustbaer schrieb:

    EinGast schrieb:

    Warum muss das bei dir so kompliziert sein?

    Das frag' ich mich auch oft.

    Ich frage mich eher, warum Ihr Euch künstlich doof stellt. Die Motivation liegt doch auf der Hand: Die DLL wird geladen und die Fensterklassen automatisch registriert (@Swordfish: Fensterklassen registrieren heißt RegisterClass/Ex aufrufen). Das kann für den Anwender schön einfach sein, das Gegenteil von kompliziert. Die ursprüngliche Frage halte ich von daher für mehr als berechtigt.

    Aber da er ja nun weiß, dass das so nicht zuverlässig funktioniert, wird er das ja jetzt auch anders machen (müssen).



  • Und eben das ist, so wie er sich es vorstellt, nicht möglich. Entweder lädt er die DLL, z.B mit LoadLibrary , oder seine EXE muss etwas aus der DLL importieren.

    Das kann auch, wenn es, aus welchen Grund auch immer, DllMain sein muss, eben DllMain sein (in main.cpp einfügen):

    static BOOL (WINAPI *dllmain)(HINSTANCE, DWORD, LPVOID) = DllMain;
    

    Na ja.



  • Alternativ (nicht das jemand noch sagt, es ginge auch anders) kann die Linker-Option /INCLUDE verwendet werden:

    /INCLUDE:__imp__DllMain@12
    

    Das ist jedoch in meinen Augen nicht so einfach wie eine Funktion, die nichts macht oder seine Kontrollelemente registriert, aufzurufen.



  • DLL in EXE einbinden: http://www.oreans.com/xbundler.php
    Man findet auch sicher irgendwo source für sowas..



  • EinGast schrieb:

    Und eben das ist, so wie er sich es vorstellt, nicht möglich.

    <Loriot>Ach was?</Loriot>
    Das haben wir doch nun bereits mehrfach festgestellt.



  • Vielen Dank für die Antworten.

    Dann komm ich wohl nicht drumherum die LoadLibrary-Funktion einzusetzen, wobei die /Include-Variante nicht so schlecht ist.



  • Du sollst eine eigene Init-Funktion machen, hast du das nicht mitbekommen?
    Dann entfällt auch die Notwendigkeit für LoadLibrary oder irgendwelche Linker-Switches.


Anmelden zum Antworten