Ersatz für GlobalAlloc()



  • Hallo,

    im Rahmen der Benutzung von CreateIndirectDialog (Dialogtemplate in memory) wird im Beispielcode auf der MSDN Website folgendes gemacht:

    LPDLGTEMPLATE lpdt;
    
        hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024); 
        lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);
        .
        .
        GlobalUnlock(hgbl); 
        ret = DialogBoxIndirect(hinst, 
                               (LPDLGTEMPLATE)hgbl, 
                               hwndOwner, 
                               (DLGPROC)DialogProc); 
        GlobalFree(hgbl);
    

    Können GlobalAlloc/Unlock/Free... durch moderne C++11/14 Befehle ersetzt werden?
    Ich benutze MSVS2015.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Naja, die Funktion will ja einfach einen Pointer auf eine entsprechende Stuktur. So lang die Struktur also richtig gebaut ist, wird's der Funktion herzlich egal sein, ob der Speicher, in dem sie sich befindet, auf irgendeinem Heap allokiert wurde oder sonstwo. Die Doku der Funktion sagt auch nicht, dass der Speicher unbedingt mit irgendeiner der 27 verschiedenen Heap API Funktionen oder gar konkret mit GlobalAlloc() geholt werden muss. Du solltest den also anlegen können, wie auch immer dir lieb ist...



  • Das Problem ist daß einfach ein Pointer nicht funktioniert. Falls die Allokation wegfällt, wird das Dialogfenster nicht erzeugt, weil in der Kernfunktion der Fehlercode 1814 erzeugt wird.
    Selbst mit einem

    std::unique_ptr
    

    Pointer klappt das nicht.

    Es scheint so als gäbe es keine Alternative zu den Globalxxx-Funktionen. Ich werde das wohl so machen müssen.

    Vorschläge sind trotzdem gerne gesehen, vlt. hat jemand mehr Erfahrung damit. 🙂



  • Und mit GlobalAlloc() funktioniert's?



  • dot schrieb:

    Und mit GlobalAlloc() funktioniert's?

    Ja weil das von MS im Beispiel vorhanden ist, siehe

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms644996%28v=vs.85%29.aspx#template_in_memory.

    Meine Frage wäre ob es mit modernen C++ Sprachmitteln einen Ersatz für das angestaubte GlobalAlloc gibt.
    Ich möchte so gut wie es geht auf reine C Elemente verzichten.



  • MFC-Coder schrieb:

    dot schrieb:

    Und mit GlobalAlloc() funktioniert's?

    Ja weil das von MS im Beispiel vorhanden ist, siehe

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms644996%28v=vs.85%29.aspx#template_in_memory.

    Ich meine: Mit GlobalAlloc() funktioniert es bei dir in deiner Anwendung und mit was anderem nicht? Weil ansonsten kann der Fehler natürlich alles mögliche sein...



  • Ist jetzt natürlich richtig pfiffig, den nicht funktionierenden Code auch nicht zu zeigen...



  • GlobalAlloc ist nur noch aus Kompatibilitätsgründen zu 16bit Anwendungen vorhanden und tut nichts anderes als HeapAlloc aufzurufen.

    [quote="MFC-Coder"]

    dot schrieb:

    Meine Frage wäre ob es mit modernen C++ Sprachmitteln einen Ersatz für das angestaubte GlobalAlloc gibt.
    Ich möchte so gut wie es geht auf reine C Elemente verzichten.

    Ganz egal welche "C++ Ersatzfunktion" Du aufrufst, sie wird letzten Endes HeapAlloc aufrufen.


  • Mod

    Ganz klar: GlobalAlloc ist nicht notwenig.
    DialogBoxIndirect nimmt jeden Zeiger.
    Die MFC macht es nicht anders und ich habe diese Templates auch schon in x-Varianten aufgebaut.

    Diu weißt was der Fehler 1814 bedeutet?
    "Der angegebene Ressourcenname wurde nicht in der Image-Datei gefunden."

    Hört sich nach was anderem an...



  • Martin Richter schrieb:

    Diu weißt was der Fehler 1814 bedeutet?
    "Der angegebene Ressourcenname wurde nicht in der Image-Datei gefunden."

    Hört sich nach was anderem an...

    Der Fehler kam nachdem ich DLGTEMPLATE anstatt LPDLGTEMPLATE benutzte.
    ---
    Funktioniert so:

    HGLOBAL global = nullptr;
    LPDLGTEMPLATE dialogTemplate;
    
    global= GlobalAlloc(GMEM_ZEROINIT, 1024);
    if (!global)
    	return false;
    
    dialogTemplate = (LPDLGTEMPLATE)GlobalLock(global);
    
    dialogTemplate->style = WS_POPUP | WS_VISIBLE | WS_CAPTION;
    dialogTemplate->dwExtendedStyle = DS_SETFONT | DS_FIXEDSYS | DS_MODALFRAME;
    dialogTemplate->cdit = 0;
    dialogTemplate->x = 0;
    dialogTemplate->y = 0;
    dialogTemplate->cx = 16;
    dialogTemplate->cy = 16;
    
    GlobalUnlock(global);
    returnValue = createDialog(dialogTemplate, this->parentWindow);
    GlobalFree(global);
    

    ---

    Fehler:

    HGLOBAL global = nullptr;
    LPDLGTEMPLATE dialogTemplate;
    
    dialogTemplate->style = WS_POPUP | WS_VISIBLE | WS_CAPTION;
    dialogTemplate->dwExtendedStyle = DS_SETFONT | DS_FIXEDSYS | DS_MODALFRAME;
    dialogTemplate->cdit = 0;
    dialogTemplate->x = 0;
    dialogTemplate->y = 0;
    dialogTemplate->cx = 16;
    dialogTemplate->cy = 16;
    
    returnValue = createDialog(dialogTemplate, this->parentWindow);
    

    Hier gibts ne Schreibzugriffsverletzung: "dialogTemplate war nullptr".



  • Das ist irgendwie klar. Jetzt musst du bloss noch C lernen.



  • hustbaer schrieb:

    Das ist irgendwie klar. Jetzt musst du bloss noch C lernen.

    Eine Initialisierung von dialogTemplate um den Laufzeitfehler zu vermeiden erzeugt den Fehler 1814!


  • Mod

    hustbaer schrieb:

    Das ist irgendwie klar. Jetzt musst du bloss noch C lernen.

    👍 🤡

    MFC-Coder schrieb:

    Hier gibts ne Schreibzugriffsverletzung: "dialogTemplate war nullptr".

    Ach ne... Warum nur?

    MFC Coder schrieb:

    Eine Initialisierung von dialogTemplate um den Laufzeitfehler zu vermeiden erzeugt den Fehler 1814!

    Und wie hast Du das gemacht? Versuch doch uns wenigstens etwas zu helfen in dem Du den Code sendest der Probleme macht...


Anmelden zum Antworten