WinApi: SetWindowLongPtr возвращает ошибку, но работает

Подскажите пожалуйста, почему так происходит:

Мне необходимо применить для моего Родительского окна в ходе срабатывания определенного условия в WindProc - стиль WS_VSCROLL, ну чтобы в какой то момент у окна появилась вертикальная полоса прокрутки. Собственно, я вызываю функцию:

     SetLastError(1);   //MSDN рекомендует установить код перед вызовом SetWindowLongPtr
        LONG_PTR My_LONG_PTR = SetWindowLongPtr(hWnd, GWL_EXSTYLE, WS_VSCROLL);
        cout << GetLastError() << endl;//Код ошибки 87 - неверный параметр

Как видно при таком вызове - возникает ошибка 87 - неверный параметр. Только стоит изменить GWL_EXSTYLE на GWL_STYLE, в этом случае, код ошибки установленный SetLastError() - не меняется, то есть SetWindowLongPtr - завершается успешно. Все хорошо и классно.

Но меня интересует другое, а именно, почему в первом случае, функция завершилась с ошибкой 87, но все равно применила указанный WS_VSCROLL стиль, то есть у окна появилась вертикальная полоса прокрутки.


Ответы (3 шт):

Автор решения: MBo

Возможно, в расширенном стиле должны присутствовать определённые компоненты. Чтобы не разрушить стиль совсем, а только добавить нужное, делают так:

SetWindowLongPtr(hWnd, GWL_EXSTYLE, WS_VSCROLL | GetWindowLongPtr(hWnd, GWL_EXSTYLE));
→ Ссылка
Автор решения: gbg

Как минимум, нужно внимательно сделать точно то, что написано в MSDN, а именно:

by calling SetLastError with 0

Чистить старое состояние ошибки значением 0 (вы задаете 1)

Function failure will be indicated by a return value of zero and a GetLastError result that is nonzero.

Ошибка возникает, когда функция вернула 0 и GetLastError вернула не 0, у сравнения возвращенного функцией значения с 0 нет

→ Ссылка
Автор решения: Alex Guteniev

SetWindowLong[Ptr] не просто сеттер в некоторую область памяти, даже скорее "просто не сеттер", хоть и константы похоже на смещения. Она обрабатывает входящие значения, особенно GWL_EXSTYLE / GWL_STYLE

Окну приходят WM_STYLECHANGING/WM_STYLECHANGED. В первом из них окно может исправить и установленные стили, и возвращаемое старое значение.

→ Ссылка