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.