Блог GunSmoker-а (переклади) Що це за дивні значення, що повертаються GWLP_WNDPROC

. коли встановлюють одну версію, як добре, як програмування на комп'ютері, що це означає, що людина.

Що це за дивні значення GWLP_WNDPROC?

GetWindowLongPtr(hwnd, GWLP_WNDPROC) (або GetWindowLong(hwnd, GWL_WNDPROC), якщо ви ще не зробили свій код сумісним з 64-розрядною ОС) повинна повертати поточну віконну процедуру. Чому ж я іноді отримую при цьому якісь зовсім ліві значення? Бо іноді "ви не можете впоратися з істиною".

Якщо поточна віконна процедура несумісна зі стороною, що викликає, тоді не можна повернути вам справжній покажчик на функцію, тому що ви не зможете його викликати. Натомість повертається "чарівне число". Єдиний зміст цього значення - бути впізнаним функцією CallWindowProc, щоб вона змогла перевести параметри повідомлення у формат, на який чекає справжня віконна процедура, і коректно її викликати.

Наприклад, припустимо, що ви працюєте на Windows XP і що вікно є вікном UNICODE, але компонент, скомпільований як ANSI, викликає GetWindowLong(hwnd, GWL_WNDPROC) (насправді це буде виклик GetWindowLongA, тому компонент скомпілюваний як ANSI - прим. пров.). При цьому не можна повернути прямий покажчик на віконну процедуру, тому що вона очікує на параметри повідомлень у форматі UNICODE, а ваш компонент оперує з повідомленнями у форматі ANSI. Тому натомість повертається чарівне значення. Коли ви передаєте це чарівне значення в CallWindowProc, вона розпізнає це значення як: "Ох, мені потрібно перевести параметри для повідомлення з ANSI до UNICODE і передати UNICODE-повідомлення у ту віконну процедуру".

(Ці перетворення відомі як "thunks".)

Тому пам'ятайте: єдина річ, яку можназробити зі значенням, отриманим від GetWindowLongPtr(hwnd, GWLP_WNDPROC), це: (1) передати це значення CallWindowProc, або (2) передати його назад через SetWindowLongPtr(hwnd, GWLP_WNDPROC).

Коментарів немає:

Можна використовувати деякі HTML-теги, наприклад:

Будь ласка, по можливостівикористовуйте "Ім'я/URL" замість "Анонімний". URL-адресу можна просто не вказувати.

Ваше повідомлення може бути позначене як спам-фільтром - не хвилюйтеся, воно з'явиться після перевірки адміністратором.