Benutzer mit den meisten Antworten
DWORD cast DWORD_PTR x64

Frage
-
Hallo ich habe mal ne Verständnisfrage :-)
Ich habe einen DWORD Werte den ich als Verweis korrekt für x86/x64 Plattform übergeben/verändern will. Ich will das mal vereinfacht darstellen.
Funktion:
void myfunc(DWORD_PTR p) { if (*(DWORD*)p > 100) *(DWORD*)p = 0; }
Aufruf:
DWORD dw = 100; myfunc((DWORD_PTR)&dw);
Ist das korrekt so ? Ich bekomme nämlich wenn ich schreibe: myfunc( static_cast<DWORD_PTR>(&dw)); einen Fehler C2440, d.h. ich muss ein reinterpret_cast verwenden, das hätte ich nicht erwartet ich dachte ein DWORD_PTR wäre immer ein Pointer auf einen DWORD, nur halt mal 32 Bit und mal 64 Bit lang.
Freudi
Antworten
-
void myfunc(DWORD_PTR p)
{ if (*(DWORD*)p > 100) *(DWORD*)p = 0; }
Ein DWORD_PTR ist einfach nur ein DWORD, kein Pointer. Allerdings ist dieses DWORD breit genug, um einen solchen ohne Verluste aufnehmen zu können, also 64 Bit in Deinem Fall.
Wenn Du Zeiger verwenden willst, dann schreibe das lieber auch so hin, denn dann klappt es komplett ohne Cast, z.B:
void myfunc(DWORD* p) { if (*p > 100) *p = 0; } DWORD dw = 100; myfunc(&dw);
- Als Antwort markiert Freudi Donnerstag, 2. März 2017 16:03
Alle Antworten
-
Schau dir mal die Definitionen an:
typedef unsigned long DWORD;
und in basetsd.h
typedef unsigned long long ULONG_PTR; typedef ULONG_PTR DWORD_PTR;
Sind also unterschiedliche Typen.
DWORD_PTR ist 64 bit, DWORD 32 bit. Du müsstest statt DWORD also DWORD64 benutzen.
Gruß, Guido
- Als Antwort vorgeschlagen Florian Haupt Donnerstag, 2. März 2017 15:13
-
Das verstehe ich jetzt noch nicht. Ich habe eine DWORD Variable, kommt von GetTickCount, die möchte ich per Verweis in eine Unterfunktion übergeben. Dort wird sie protokolliert und auf den aktuellen GetTickCount gestellt.
GetTickCount liefert immer einen 32 Bit DWORD egal ob 32 oder 64 Bit, da muss sich MS ja auch was danbei gedacht haben, nach Deiner Version versteh ich das so das GetTickCount je nach Plattform DWORD oder DWORD64 liefern müsste das tut es aber nicht.
Die Variable ist also vom Typ DWORD und wohl IMMER 32 Bit lang egal ob 32 oder 64 Bit Plattform. Nur der Zeiger darauf wird wohl unterschiedlich sein. Ich dachte dafür gibt's die Definition DWORD_PTR die je nach Plattform die richtige Länge hat. Ich hätte aber erwartet das das static_cast dann erfolgreich ist, das wundert mich.
Freudi
-
void myfunc(DWORD_PTR p)
{ if (*(DWORD*)p > 100) *(DWORD*)p = 0; }
Ein DWORD_PTR ist einfach nur ein DWORD, kein Pointer. Allerdings ist dieses DWORD breit genug, um einen solchen ohne Verluste aufnehmen zu können, also 64 Bit in Deinem Fall.
Wenn Du Zeiger verwenden willst, dann schreibe das lieber auch so hin, denn dann klappt es komplett ohne Cast, z.B:
void myfunc(DWORD* p) { if (*p > 100) *p = 0; } DWORD dw = 100; myfunc(&dw);
- Als Antwort markiert Freudi Donnerstag, 2. März 2017 16:03
-
GetTickCount liefert immer einen 32 Bit DWORD egal ob 32 oder 64 Bit, da muss sich MS ja auch was danbei gedacht haben, nach Deiner Version versteh ich das so das GetTickCount je nach Plattform DWORD oder DWORD64 liefern müsste das tut es aber nicht.
GetTickCount liefert DWORD zurück, das ist derzeit 32 Bit breit, auf beiden Plattformen. Würde es je nach Plattform 32 oder 64 Bit zurückgeben, würdest Du im Header DWORD_PTR als Rückgabewert finden, nicht aber DWORD. Im Falle GetTickCount heißt die 64 Bit Variante allerdings GetTickCount64.
- Bearbeitet Rene Koenig Donnerstag, 2. März 2017 15:42