Блогът на GunSmoker (преводи) Какви са тези странни стойности, върнати от GWLP_WNDPROC

. когато промяната на съзнанието става толкова лесна, колкото програмирането на компютър, какво означава да си човек.

Какви са тези странни стойности, върнати от GWLP_WNDPROC?

GetWindowLongPtr(hwnd, GWLP_WNDPROC) (или GetWindowLong(hwnd, GWL_WNDPROC) ако все още не сте направили своя код 64-битов съвместим) трябва да върне текущата процедура на прозореца. Защо понякога получавам някои напълно леви стойности? Защото понякога "не можете да се справите с истината".

Ако текущата прозоречна процедура е несъвместима с извикващия, тогава не можете да получите реален функционален указател, който ви се връща, защото не можете да го извикате. Вместо това се връща „магическо число“. Единствената цел на тази стойност е да бъде разпозната от функцията CallWindowProc, така че да може да преведе параметрите на съобщението във формата, очакван от реалната прозоречна процедура, и да я извика правилно.

Например, да кажем, че работите с Windows XP и че прозорецът е UNICODE прозорец, но компонент, компилиран като ANSI, извиква GetWindowLong(hwnd, GWL_WNDPROC) Въпреки това не можете да върнете директен указател към прозоречната процедура, тъй като тя очаква UNICODE параметри на съобщението, а вашият компонент работи с ANSI съобщения. Така вместо това се връща магическата стойност. Когато предадете тази магическа стойност на CallWindowProc, той ще разпознае тази стойност като: "о, трябва да конвертирам параметрите за съобщението от ANSI в UNICODE и да предам UNICODE съобщението на тази прозоречна процедура."

(Тези трансформации са известни като "thunks".)

Така че помнете: единственото, което можетекакво да направите със стойността, получена от GetWindowLongPtr(hwnd, GWLP_WNDPROC), е: (1) да прехвърлите тази стойност на CallWindowProc или (2) да я върнете обратно през SetWindowLongPtr(hwnd, GWLP_WNDPROC).

Без коментари:

Могат да се използват някои HTML тагове, например:

Моля, ако е възможно,използвайте „Име/URL“ вместо „Анонимен“. URL адресът може просто да бъде пропуснат.

Вашето съобщение може да бъде маркирано като спам от спам филтъра - не се притеснявайте, то ще се появи, след като администратор го провери.