in einer Dll Speicher für anderen Process reservieren



  • Hallo zusammen,

    also ich hab folgendes vor:

    Ich möchte in meinem Programm mehrere Sprachen unterstützen.
    Ich schreibe eine DLL in der ich als Resource ne Stringtable einbaue.
    die Dll bekommt bspw. den Namen GermanLang.dll
    jetzt lade ich mir den Eintrag XY aus der Stringtable über LoadString()
    (HINSTANCE ist die der DLL, logisch 😉 )...
    Jetzt würde ich gerne in die DLL eine Funktion einbauen, die:

    1. den string aus der Stringtable sucht,
    2. einen übergebenen 'PSTR-Speicher' reserviert (denk is klar was gemeint ist^^)
    3. und dann den String aus der Table in den reservierten Buffer kopiert.

    Nach dem man im Hauptprogramm nun die DLL geladen hat übergibt man lediglich der 'Laden-Fuktion' eine Zeigervar. diese wird dann von der DLL initialisiert und, nachdem man den String nicht mehr braucht gibt man den Speicher wieder frei...

    SO, Meine Fragen:
    Wie reserviere ich Speicher für das aufrufende Programm(-modul) ?

    PS: Bitte nich VirtualAlloc 😮 , das muss doch auch anders gehen

    Vielen großen lieben Dank im voraus



  • Wenn du die DLL geladen hast befindet sie sich im Addressraum von dem Prozess der sie geladen hat. Innerhalb der DLL Funktion kannst du mit den ganz normalen Memory funktionen arbeiten, allerdings sollte Speicher, denn die DLL alloziert, auch wieder von der DLL freigegeben werden...

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/memory_management_functions.asp



  • Ich würde nicht empfehlen den Speicher in der DLL zu allokieren...
    I.d.R. macht man es so:

    BOOL GetString(LPSTR szBuffer, LPDWORD pdwSize);
    

    In einem ersten Aufruf zu "GetString" wird "szBuffer" auf NULL gesetzt und in "pdwSize" dann die erforderliche Länge zurückgegen.
    In einem zweiten Aufruf wird dann von der EXE zuerst der Speicher allokiert und dann entsprechend richtig übergeben.

    Alternativ kannst Du sowohl in der EXE als auch der DLL die gleiche DLL-CRT verwenden und kannst dann z.B. CString oder std::string verwenden.



  • also Danke erstmal für eure Posts 😉

    @Jochen Kalmbach:

    Jo verstehe was du meinst, aber diesen Vorgang (Speicher reservieren) sollte ja die DLL machen ->: weniger Arbeit :p

    Aber wenn ihr mir davon abräht ...OK dann eben nicht ...wär halt nur schön einfach gewesen:

    LoadLangString(...);
    // benutzen
    UnloadLangString(...);

    aber trotzdem danke 😉 👍



  • Du kannst natürlich auch den Speicher in der DLL reservieren, dann kommt es darauf an, wer den Speicher wieder freigibt.
    Wenn die DLL den Speicher wieder freigibt (via eigene Funktion ala FreeString), dann kannst Du auch unterschiedliche CRTs verwenden. Wenn der Speicher in der EXE freigegeben werden soll, dann musst Du die gleiche CRT-DLL verwenden.



  • ehh sry ...."CRT" was ist n das, in diesen Kontext ? 🤡

    und ja ich denke genau das meine ich, in der DLL speicher allokieren (der auch von der DLL wieder freigeben wird)...kann ich denn dann auch von meinem Progg darauf zugriefen, und wie, einfach via Zeiger ?

    Danke nochmal für deine Hilfe 🙂



  • Mr. Kompliziert schrieb:

    ehh sry ...."CRT" was ist n das, in diesen Kontext ? 🤡

    C-Runtime... das was eigentlich (fast) jedes C-Programm verwenden... (oder verwendest Du kein new/malloc/usw. !?)

    Mr. Kompliziert schrieb:

    und ja ich denke genau das meine ich, in der DLL speicher allokieren (der auch von der DLL wieder freigeben wird)...kann ich denn dann auch von meinem Progg darauf zugriefen, und wie, einfach via Zeiger ?

    Ja.



  • oder verwendest Du kein new/malloc/usw. !?

    doch klar, wüsste nur nicht, dass das unter den Namen CTR fällt, also danke 😉


Anmelden zum Antworten