Typecast DWORD in Pointer



  • Hallo,

    ich hab folgendes vor:
    ich möchte in einem CTreeCtrl zu einem Blatt Daten speichern.
    Bisher speichere ich dazu in dem HTREEITEM per SetItemData einen int-Wert und verknüpfe mit diesem int-Wert zu einem Array meiner Datenstruktur die zu dem HTREEITEM.
    Jetzt dachte ich mir, dass es doch viel eleganter wäre den Pointer auf eine solche Datenstruktur direkt in das DWORD zu speichern.
    Aus dieser Idee folgender Code:

    HTREEITEM eins = m_pTreeCtrl.InsertItem("Test");
    TreeDates *test = new TreeDates;
    //TreeDates hab ich mir selbst definiert
    test->description="HALLO";
    m_pTreeCtrl.SetItemData(eins, (DWORD)test);
    

    Bis zu SetItemData klappt das alles noch. Jetzt würde ich gerne das DWORD per GetItemData wiedere auslesen, in einen Pointer auf TreeDates zurückcasten, damit ich dann die description wieder auslesen kann.
    Einfach nur das DWORD auf TreeDates casten funktioniert leider nicht...

    Hat jemand ne Erklärung wie es geht oder warum es nicht gehen kann?

    Danke Chris



  • Der Cast auf ein DWORD ist eine schlechte Idee, damit baust Du für eine mögliche 64-bit Kompilierung unnötige Probleme. Unter x64 ist ein Zeiger größer als ein DWORD, welches auch unter x64 auf 32 Bit beschränkt bleibt. Richtig ist stattdessen die Verwendung von DWORD_PTR.

    GetItemData gibt einen DWORD_PTR zurück, die Konvertierung auf Dein Element ist damit

    TreeDates *test = reinterpret_cast<TreeDates*>(m_pTreeCtrl.GetItemData(eins));
    

    und eigentlich genau das, was bei Dir nicht funktioniert. Gibt denn GetItemData einen gültigen Wert zurück?



  • Habs grad ausprobiert.
    Anscheinend is mir vorhin die Fehlermeldung nicht aufgefallen.
    Denn ich krieg bei meinem Code zwar alles kompiliert und er zeigt mir mein Fenster auch an, aber ich krieg dann eine Meldung, dass die Anwendung ein Problem erzeugt und deshalb geschlossen werden muß - speicher ich testhalber einen int-Wert is die Meldung weg.
    Allerdings bevor das passiert klappt das zurücklesen des DWORDs und die Rückkonvertierung.

    Aber an das Problem mit 64bit Anwendungen hab ich wirklich nicht gedacht...
    Also werd ich wohl doch den alten Weg gehen und mir in das DWORD einen int Wert speichern und über den Wert ein Element aus einem TreeDate-Array ansprechen.
    Aber Danke für die Hilfe...



  • Das Speichern eines Zeigers über CTreeCtrl/CListCtrl.SetItemData ist schon der richtige Weg, das mache ich in meinen Anwendungen auch vielfach. Bei Dir scheint es daher an anderer Stelle zu haken. Da hilft leider nur eine umfangreiche Debugsitzung.


Anmelden zum Antworten