DWORD и DWORD_PTR на 64-битной машине - PullRequest
4 голосов
/ 03 мая 2011

В Windows API добавлено несколько типов *_PTR для поддержки 64-битной адресации Win64.

SetItemData(int nIndex,DWORD_PTR dwItemData)

Этот API-интерфейс работает как для 64-битных, так и для 32-битных машин, когда я передаю второй параметр как DWORD.

Я хочу знать, произойдет ли сбой этого конкретного API на 64-битной машине, если я передам второй параметр как DWORD.Как проверить сценарий сбоя?

Спасибо, Nikhil

1 Ответ

4 голосов
/ 03 мая 2011

Функция не выйдет из строя, если вы передадите DWORD, потому что она вписывается в DWORD_PTR. Однако указатель гарантированно помещается в DWORD_PTR, но , а не в DWORD на 64-битных платформах.

Таким образом, этот код является правильным:

int *before_ptr = new int;
yourListBox.SetItemData(index, (DWORD_PTR) before_ptr);
int *after_ptr = (int *) yourListBox.GetItemData(index);
ASSERT(before_ptr == after_ptr);  // Succeeds.
delete after_ptr;                 // Works.

Но этот код неверен и будет молча обрезать указатель до его младших 32 бит:

int *before_ptr = new int;
yourListBox.SetItemData(index, (DWORD) before_ptr);
int *after_ptr = (int *) yourListBox.GetItemData(index);
ASSERT(before_ptr == after_ptr);  // Fails.
delete after_ptr;                 // Undefined behavior, might corrupt the heap.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...