2016-05-27 7 views
0

Ich benutze GetProp()/SetProp() mit einem Atom. Unter x64 ist der 'lpString' von SetProp() 64 Bit lang.GetProp()/SetProp() mit Atom unter Windows x64

Das MS-Dokument sagt: "Das Atom muss in das niederwertige Wort von lpString platziert werden; das höherwertige Wort muss Null sein." Siehe: https://technet.microsoft.com/de-de/ms633568

Normalerweise verwende ich, um die lpString-Parameter, die unter x32 in Ordnung erscheinen scheinen. Aber was ist die Definition eines "Wortes" unter x64?

GetProp (hwnd, (LPCTSTR) MAKELONG (Atom, 0)) erstellt eine Warnung unter x64, die richtig ist. Aber welche Art von Konvertierung sollte hier verwendet werden?

+1

Verwenden Sie MAKEINTATOM. –

Antwort

1

Was ist die Warnung? Möglicherweise muss es stattdessen als (LPTSTR) umgewandelt werden.

+0

Die Warnung lautet: "Geben Sie eine Umwandlungsumwandlung von LONG in LPTSTR mit größerer Größe ein." Ich frage mich, ob das MAKELONG() immer noch richtig unter x64 ist. – WWebber

+0

Sie könnten versuchen, etwas wie: '#define MAKELONGLONG (lo, hi) ((LONGLONG) lo + ((LONGLONG) hi << 32)), um Ihr eigenes Makro zu erstellen, um eine 64-Bit-Ganzzahl zu generieren – kcraigie

+0

Vielen Dank dafür Tipp, ich weiß, ich könnte Typecasts verwenden, aber ist dies eine offizielle MS-Stellungnahme zu diesem Thema? Ich möchte x86/x64-Code ohne alle Arten von #ifdefs schreiben ... – WWebber

1

Gemeint ist, dass der vorzeichenlose numerische Wert des String-Pointers unter 65535 (0xFFFF) liegen muss. Alle höheren Bits müssen gelöscht werden. Also müssen in x64 die höheren 48 Bits Null sein. Der Begriff "Wort" bezieht sich immer auf 16-Bit-Werte. Die MS-Dokumentation wird nicht für x64 aktualisiert und spricht über 32-Bit-Zeiger wie in x32.

Die Logik für den oberen Wert von 0xFFFF ist, dass (zugeordnet) Arbeitsspeicher in Prozessen immer weit über der 0xFFFF Adresse starten. Die meisten ausführbaren Dateien werden beispielsweise in x32 unter 0x40000 geladen. So kann ein Zeiger "wiederverwendet" werden, um eine ganze Zahl zu speichern, solange die ganze Zahl unter 0xFFFF liegt, ohne dass es eine Chance gibt, dass an der Adresse Speicher vorhanden ist.

Verwandte Themen