GlobalAlloc und Vista



  • Hallo zusammen,

    Ich hoffe, ich bin hier richtig mit meiner Frage.

    wir haben angefangen unsere Programme mit Vista (Beta) zu testen und natürlich gab es probleme. Nachdem das Setup funktionierte (nach ein paaaaaaar Änderungen), scheint nun das GlobalAlloc nicht zu funktionieren. Es überrascht mich nicht wirklich, da es sich ja noch um 16-Bit Relikte handelt.

    Mein Frage ist nun: Welche Alternative zu GlobalAlloc ist zu empfehlen? Ich habe da an VirtualAlloc gedacht. Allerdings gab es auch Meinungen, die eine umstellung auf new und delete empfohlen haben.

    Gruß André



  • Was heißt GlobalAlloc funktioniert nicht?



  • Sorry, es geht um GlobalReAlloc.
    folgende Codezeile:
    pCtrli->hRecData = GlobalReAlloc(pCtrli->hRecData, pCtrli->nRecDataLen, GMEM_ZEROINIT | GMEM_NOCOMPACT) ;

    pCtrli->hRecData ist danach NULL.

    Gruß André



  • Lass doch mal GMEM_NOCOMPACT weg und sag den Wert von GetLastError().



  • So einfach ist das nicht, da ich im Moment in anderen Projekten drinhänge und nicht eben mal ein Vista-Rechner mit Entwicklungsumgebung aufbaue. 🙂

    Eigentlich geht es auch darum, GlobalAlloc zu ersetzen. Laut MSDN soll man das durch HeapAlloc ersetzen. Doch irgendwie habe ich da den Eindruck, dass da mehr dranhängt. Soweit ich das überblicken kann, muss ich dann einen lokalen Heap für die gesamte Applikation verwalten. Und da muss ich mich ertsmal reinarbeiten (ich bin nicht so der Experte im Speichermanagement).

    Ich dachte halt nur, dass man es sich einfacher machen kann.

    Gruß André

    PS: Ah, jetzt weis ich warum Du nach der Fehlernummer fragst. Ich kann das genaue Statement nur deshlab sagen, da ein egenaue Fehlermeldung im Release erzeugt wird. Also ich habe keinen Vista-Rechner vor mir stehen, den hat unsere QA.



  • Bei der Frage mit dem Ersetzen von Globalalloc bin ich nun weitergekommen und brauche keine Hilfe mehr (denke ich 😉 ). Man benötigt keinen extra Heap für HeapAlloc, man kann mit GetProcessHeap() arbeiten. Der Rest sollte gleich sein.

    Warum nun GlobalReAlloc nicht funktioniert könnte noch eine andere Ursache haben. Die neuen Prozessoren und nun wohl auch die neuen Betriebssysteme haben einen Schutz, der es verhindert, dass man ausführbaren Speicher überschreibt. GlobalAlloc reserviert den Speicher aber per Standard als read/write/executeable. Ein GlobalReAlloc mit ZEROINIT dürfte demzufolge ganz böse auf die Finger bekommen. Da vermute ich das Problem, wo bei die Betonung auf "vermute" liegt. Es gibt eine Art Whitelist für Vista, wo die Applikationen geführt werden, die auch ausfühbaren Speicher überschreiben dürfen. Ich habe nur noch nicht rausgefunden, wie ich eine Applikation dort hinzufügen kann. ihr werdet mehr von mir hören, wenn ich es getestet habe.

    Gruß André



  • Ich habe es getestet und dies scheint auch nicht das Problem zu sein.
    Ich habe mich da wohl auch geirrt. Das mit den neuen Przessoren und so hat einen anderen Hintergrund. Da wird das ausführen von Code im Datensegment unterbunden.

    Ich werde wohl nicht um eine ausführliche Bearbeitung dieses Themas herumkommen. Wenn ich noch daran denke, werde ich die Lösung posten.

    Gruß André


Anmelden zum Antworten