user32: Add exception handler to GetWindowText.

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Dmitry Timoshkov 2021-11-22 10:48:21 +03:00 committed by Alexandre Julliard
parent 4b9010d538
commit ecd1c66476
2 changed files with 68 additions and 20 deletions

View file

@ -7923,18 +7923,37 @@ static void test_gettext(void)
if (0) if (0)
{ {
r = SendMessageA( hwnd, WM_GETTEXT, 0x10, 0x1000); r = SendMessageA( hwnd, WM_GETTEXT, 0x10, 0x1000);
ok( r == 0, "settext should return zero\n"); ok( r == 0, "WM_GETTEXT should return zero (%ld)\n", r );
r = SendMessageA( hwnd, WM_GETTEXT, 0x10000, 0); r = SendMessageA( hwnd, WM_GETTEXT, 0x10000, 0);
ok( r == 0, "settext should return zero (%ld)\n", r); ok( r == 0, "WM_GETTEXT should return zero (%ld)\n", r );
r = SendMessageA( hwnd, WM_GETTEXT, 0xff000000, 0x1000); r = SendMessageA( hwnd, WM_GETTEXT, 0xff000000, 0x1000);
ok( r == 0, "settext should return zero (%ld)\n", r); ok( r == 0, "WM_GETTEXT should return zero (%ld)\n", r );
r = SendMessageA( hwnd, WM_GETTEXT, 0x1000, 0xff000000); r = SendMessageA( hwnd, WM_GETTEXT, 0x1000, 0xff000000);
ok( r == 0, "settext should return zero (%ld)\n", r); ok( r == 0, "WM_GETTEXT should return zero (%ld)\n", r );
} }
/* GetWindowText doesn't crash */
r = GetWindowTextA( hwnd, (LPSTR)0x10, 0x1000 );
ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
r = GetWindowTextA( hwnd, (LPSTR)0x10000, 0 );
ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
r = GetWindowTextA( hwnd, (LPSTR)0xff000000, 0x1000 );
ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
r = GetWindowTextA( hwnd, (LPSTR)0x1000, 0xff000000 );
ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
r = GetWindowTextW( hwnd, (LPWSTR)0x10, 0x1000 );
ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
r = GetWindowTextW( hwnd, (LPWSTR)0x10000, 0 );
ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
r = GetWindowTextW( hwnd, (LPWSTR)0xff000000, 0x1000 );
ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
r = GetWindowTextW( hwnd, (LPWSTR)0x1000, 0xff000000);
ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
DestroyWindow(hwnd); DestroyWindow(hwnd);
} }

View file

@ -31,6 +31,7 @@
#include "win.h" #include "win.h"
#include "controls.h" #include "controls.h"
#include "winerror.h" #include "winerror.h"
#include "wine/exception.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(win); WINE_DEFAULT_DEBUG_CHANNEL(win);
@ -2999,22 +3000,35 @@ LONG WINAPI DECLSPEC_HOTPATCH SetWindowLongW(
INT WINAPI GetWindowTextA( HWND hwnd, LPSTR lpString, INT nMaxCount ) INT WINAPI GetWindowTextA( HWND hwnd, LPSTR lpString, INT nMaxCount )
{ {
WCHAR *buffer; WCHAR *buffer;
int ret = 0;
if (!lpString || nMaxCount <= 0) return 0; if (!lpString || nMaxCount <= 0) return 0;
if (WIN_IsCurrentProcess( hwnd )) __TRY
{ {
lpString[0] = 0; lpString[0] = 0;
return (INT)SendMessageA( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString );
}
/* when window belongs to other process, don't send a message */ if (WIN_IsCurrentProcess( hwnd ))
if (!(buffer = HeapAlloc( GetProcessHeap(), 0, nMaxCount * sizeof(WCHAR) ))) return 0; {
get_server_window_text( hwnd, buffer, nMaxCount ); ret = (INT)SendMessageA( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString );
if (!WideCharToMultiByte( CP_ACP, 0, buffer, -1, lpString, nMaxCount, NULL, NULL )) }
lpString[nMaxCount-1] = 0; else if ((buffer = HeapAlloc( GetProcessHeap(), 0, nMaxCount * sizeof(WCHAR) )))
HeapFree( GetProcessHeap(), 0, buffer ); {
return strlen(lpString); /* when window belongs to other process, don't send a message */
get_server_window_text( hwnd, buffer, nMaxCount );
if (!WideCharToMultiByte( CP_ACP, 0, buffer, -1, lpString, nMaxCount, NULL, NULL ))
lpString[nMaxCount-1] = 0;
HeapFree( GetProcessHeap(), 0, buffer );
ret = strlen(lpString);
}
}
__EXCEPT_PAGE_FAULT
{
ret = 0;
}
__ENDTRY
return ret;
} }
@ -3047,17 +3061,32 @@ INT WINAPI InternalGetWindowText(HWND hwnd,LPWSTR lpString,INT nMaxCount )
*/ */
INT WINAPI GetWindowTextW( HWND hwnd, LPWSTR lpString, INT nMaxCount ) INT WINAPI GetWindowTextW( HWND hwnd, LPWSTR lpString, INT nMaxCount )
{ {
int ret;
if (!lpString || nMaxCount <= 0) return 0; if (!lpString || nMaxCount <= 0) return 0;
if (WIN_IsCurrentProcess( hwnd )) __TRY
{ {
lpString[0] = 0; lpString[0] = 0;
return (INT)SendMessageW( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString );
}
/* when window belongs to other process, don't send a message */ if (WIN_IsCurrentProcess( hwnd ))
get_server_window_text( hwnd, lpString, nMaxCount ); {
return lstrlenW(lpString); ret = (INT)SendMessageW( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString );
}
else
{
/* when window belongs to other process, don't send a message */
get_server_window_text( hwnd, lpString, nMaxCount );
ret = lstrlenW(lpString);
}
}
__EXCEPT_PAGE_FAULT
{
ret = 0;
}
__ENDTRY
return ret;
} }