C ++ Указатель как DWORD

В C ++ я могу просто привести указатель на DWORD?

MyClass * thing;
DWORD myPtr = (DWORD)thing;

Будет ли это работать?

0

Решение

Вы, несомненно, Можно сделай это.

Будет ли это работать, будет зависеть от окружающей среды и от того, что вы хотите от нее сделать.

На 32-битной Windows1 (самое распространенное место, чтобы увидеть DWORD) это будет нормально. На 64-битной Windows (где вы также видите DWORD, но не так сильно) как правило, не будет.


  1. Или, точнее, при компиляции в виде 32-разрядного исполняемого файла, который будет запускаться как 32-разрядный процесс, независимо от того, на какой копии Windows вы работаете.
5

Другие решения

В Windows довольно часто такие указатели передаются, например, в сообщениях Windows. LPARAM является typedef для LONG_PTR и довольно часто используется для передачи указателей на некоторые структуры. Вы должны использовать reinterpret_cast<DWORD_PTR>(thing) для кастинга.

5

http://en.cppreference.com/w/cpp/language/explicit_cast

Прочитайте это, поймите это, избегайте бросков в стиле C, потому что они много скрывают.

Это может быть возможно, но не имеет смысла, например, DWORD равен 4 байта, а указатель (в наши дни) равен 8.

reinterpret_cast<DWORD&>(myPtr);

Должно работать, но оно может быть неопределенным или усеченным, если что-то будет работать, что будет!

КСТАТИ, reinterpret_cast C ++ — это способ сказать «Доверяй мне, мой дорогой компилятор, я знаю, что я делаю» — он пытается интерпретировать биты (0 и 1) одной вещи как другую, независимо от того, какой смысл это имеет.

Законное использование, хотя это знаменитый взлом 1 / sqrt;)

1

Нет, в 64-битном процессе указатель является 64-битным, а DWORD — только 32-битным. Используйте DWORD_PTR.

1
По вопросам рекламы [email protected]