2012/10/24 Nikolay Sivov bunglehead@gmail.com
On 10/24/2012 11:33, Christian Costa wrote:
2012/10/24 Dmitry Timoshkov dmitry@baikal.ru
Christian Costa titan.costa@gmail.com wrote:
BOOL WINAPI ClientToScreen( HWND hwnd, LPPOINT lppnt ) {
- DWORD error = GetLastError();
- if (!hwnd)
- {
SetLastError( ERROR_INVALID_WINDOW_HANDLE );
return FALSE;
- }
- SetLastError( 0xdeadbeef ); MapWindowPoints( hwnd, 0, lppnt, 1 );
- if (GetLastError() != 0xdeadbeef)
return FALSE;
- SetLastError(error); return TRUE;
}
As been said before these games with saving/restoring last error value are broken.
Last time you said wrong so what do you mean by wrong or broken?
The only way to know if MapWindowPoints fails is to set last error first and check it after. If I don't restore the previous value, the tests will not pass. Of course I can arrange the tests but hey. And I can check windows handle here as Alexandre said.
If error reporting from MapWindowPoints is not sufficient to use it somewhere else you can always move its guts to a separate function and report failure as you want. By the way, it only fails on invalid window handles I guess, is that right? If you need this behaviour you have a failing WIN_GetPtr() in this case. Messing with last error is not a solution obviously, and I don't see where MapWindowPoints even sets it.
Sounds good. I'll do that. Basically WINPOS_GetWinOffset get most part the
job in our case and I already modified it to return an error. Yes it fails only for invalid handles. WIN_GetPtr is not enough because it just return WND_OTHER_PROCESS to call the server to ask if it exists on another process. It's what IsWindow does (and WINPOS_GetWinOffset). MapWindowPoints can fail (see test). MSDN says to call SetLastError first before calling it and read the value. I will send a patch using WINPOS_GetWinOffset. Thanks.