2014-01-03 3 views
0

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

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

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

+3

Нет, вы хотите 'uintptr_t'. – zwol

+0

Ну, ваш код в порядке 32-битного процесса. Почему вы хотите ввести указатель в DWORD? –

+0

@DavidHeffernan Я ищу указатель, который я скопировал с помощью 'ReadProcessMemory' из другого процесса. Мне нужно получить значение этого указателя, чтобы я мог читать данные из другого процесса, на который указывает этот указатель. –

ответ

5

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

Будет ли это работать, будет зависеть от среды и того, что вы хотите.

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


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

Если процесс построен как 32-битный процесс, будет ли DWORD работать? –

+0

Возможно, вы знаете ответ на этот вопрос - конфигурация по умолчанию для компилятора в Visual Studio (Win32) 32 бит? –

+0

@ChristianStewart: Да. Вы можете создать 64-битный исполняемый файл, но он еще не установлен (по умолчанию). –

1

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

+0

Будет ли это не зависеть, если процесс 32 или 64 бит? –

+0

Да, но 32-битный процесс на 64-битных окнах эквивалентен 32-битовому процессу на 32-битных окнах в этом случае. – user1937198

1

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

Читал, что, понять, что, во избежание C-стиле бросает, потому что они скрывают много.

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

reinterpret_cast<DWORD&>(myPtr); 

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

BTW, reinterpret_cast - это C + + способ сказать «Поверьте мне, мой дорогой компилятор, я знаю, что я делаю» - он пытается интерпретировать биты (0s и 1s) одной вещи как другой, независимо от того, насколько смысл, который делает.

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

5

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

Смежные вопросы