Сведения о вопросе

Oleksandrop

02:29, 18th August, 2020

Теги

windows   winapi   win64    

Какова альтернатива GWL_USERDATA для хранения указателя объекта?

Просмотров: 473   Ответов: 2

В приложениях Windows, над которыми я работаю, у нас есть пользовательский фреймворк, который находится непосредственно над Win32 (не спрашивайте). Когда мы создаем окно, наша обычная практика заключается в том, чтобы поместить this в область пользовательских данных окна через SetWindowLong(hwnd, GWL_USERDATA, this) , что позволяет нам иметь MFC-подобный обратный вызов или плотно интегрированный WndProc, в зависимости от этого. Проблема в том, что это не будет работать на Win64, так как LONG имеет только 32-битную ширину. Как лучше решить эту проблему, которая работает как на 32 -, так и на 64-битных системах?



  Сведения об ответе

DO__IT

21:05, 26th August, 2020

SetWindowLongPtr был создан для замены SetWindowLong в этих случаях. Параметр LONG_PTR позволяет хранить указатель для 32-битных или 64-битных компиляций.

LONG_PTR SetWindowLongPtr(      
    HWND hWnd,
    int nIndex,
    LONG_PTR dwNewLong
);

Помните, что константы тоже изменились, поэтому использование теперь выглядит так:

SetWindowLongPtr(hWnd, GWLP_USERDATA, this);

Также не забывайте, что теперь для извлечения указателя необходимо использовать GetWindowLongPtr :

LONG_PTR GetWindowLongPtr(      
    HWND hWnd,
    int nIndex
);

И использование будет выглядеть так (опять же, с измененными константами):

LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;


  Сведения об ответе

COOL

21:53, 25th August, 2020

Другой альтернативой является SetProp/RemoveProp (когда вы создаете подкласс окна, которое уже использует GWLP_USERDATA)

Другой хорошей альтернативой является ATL стиль thunking из WNDPROC, для получения дополнительной информации об этом см.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться