user: The result for dialog procedures is stored in DWLP_MSGRESULT.

So we have to access it using Get/SetWindowLong when unmapping the
message results (based on a patch by Troy Rollo).
This commit is contained in:
Alexandre Julliard 2006-05-17 20:53:51 +02:00
parent cb3f3afca4
commit c1c5f14839
1 changed files with 108 additions and 53 deletions

View File

@ -2955,11 +2955,10 @@ void WINPROC_UnmapMsg32WTo16( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
* *
* Call a window procedure, translating args from Ansi to Unicode. * Call a window procedure, translating args from Ansi to Unicode.
*/ */
static LRESULT WINPROC_CallProc32ATo32W( WNDPROC func, HWND hwnd, static LRESULT WINPROC_CallProc32ATo32W( WNDPROC func, HWND hwnd, UINT msg, WPARAM wParam,
UINT msg, WPARAM wParam, LPARAM lParam, BOOL dialog )
LPARAM lParam )
{ {
LRESULT result; LRESULT ret;
int unmap; int unmap;
TRACE_(msg)("func %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n", TRACE_(msg)("func %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
@ -2970,9 +2969,18 @@ static LRESULT WINPROC_CallProc32ATo32W( WNDPROC func, HWND hwnd,
SPY_GetMsgName(msg, hwnd), wParam, lParam ); SPY_GetMsgName(msg, hwnd), wParam, lParam );
return 0; return 0;
} }
result = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam ); ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
if (unmap) result = WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam, result, func ); if (unmap)
return result; {
if (dialog)
{
LRESULT result = GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
result = WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam, result, NULL );
SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
}
else ret = WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam, ret, func );
}
return ret;
} }
@ -3052,27 +3060,35 @@ static BOOL WINPROC_CallProc32WTo32A_fast( WNDPROC func, HWND hwnd,
* *
* Call a window procedure, translating args from Unicode to Ansi. * Call a window procedure, translating args from Unicode to Ansi.
*/ */
static LRESULT WINPROC_CallProc32WTo32A( WNDPROC func, HWND hwnd, static LRESULT WINPROC_CallProc32WTo32A( WNDPROC func, HWND hwnd, UINT msg, WPARAM wParam,
UINT msg, WPARAM wParam, LPARAM lParam, BOOL dialog )
LPARAM lParam )
{ {
LRESULT result; LRESULT ret;
int unmap; int unmap;
TRACE_(msg)("func %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n", TRACE_(msg)("func %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
func, hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam); func, hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam);
if (WINPROC_CallProc32WTo32A_fast( func, hwnd, msg, wParam, lParam, &result )) if (WINPROC_CallProc32WTo32A_fast( func, hwnd, msg, wParam, lParam, &ret ))
return result; return ret;
if ((unmap = WINPROC_MapMsg32WTo32A( hwnd, msg, &wParam, &lParam )) == -1) { if ((unmap = WINPROC_MapMsg32WTo32A( hwnd, msg, &wParam, &lParam )) == -1) {
ERR_(msg)("Message translation failed. (msg=%s,wp=%08x,lp=%08lx)\n", ERR_(msg)("Message translation failed. (msg=%s,wp=%08x,lp=%08lx)\n",
SPY_GetMsgName(msg, hwnd), wParam, lParam ); SPY_GetMsgName(msg, hwnd), wParam, lParam );
return 0; return 0;
} }
result = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam ); ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
if( unmap ) result = WINPROC_UnmapMsg32WTo32A( hwnd, msg, wParam, lParam, result ); if (unmap)
return result; {
if (dialog)
{
LRESULT result = GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
result = WINPROC_UnmapMsg32WTo32A( hwnd, msg, wParam, lParam, result );
SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
}
else ret = WINPROC_UnmapMsg32WTo32A( hwnd, msg, wParam, lParam, ret );
}
return ret;
} }
@ -3080,9 +3096,9 @@ static LRESULT WINPROC_CallProc32WTo32A( WNDPROC func, HWND hwnd,
* WINPROC_CallProc16To32A * WINPROC_CallProc16To32A
*/ */
static LRESULT WINPROC_CallProc16To32A( WNDPROC func, HWND16 hwnd, UINT16 msg, static LRESULT WINPROC_CallProc16To32A( WNDPROC func, HWND16 hwnd, UINT16 msg,
WPARAM16 wParam, LPARAM lParam ) WPARAM16 wParam, LPARAM lParam, BOOL dialog )
{ {
LRESULT result; LRESULT ret;
UINT msg32; UINT msg32;
WPARAM wParam32; WPARAM wParam32;
HWND hwnd32 = WIN_Handle32( hwnd ); HWND hwnd32 = WIN_Handle32( hwnd );
@ -3092,8 +3108,16 @@ static LRESULT WINPROC_CallProc16To32A( WNDPROC func, HWND16 hwnd, UINT16 msg,
if (WINPROC_MapMsg16To32A( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1) if (WINPROC_MapMsg16To32A( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0; return 0;
result = WINPROC_CallWndProc( func, hwnd32, msg32, wParam32, lParam ); ret = WINPROC_CallWndProc( func, hwnd32, msg32, wParam32, lParam );
return WINPROC_UnmapMsg16To32A( hwnd32, msg32, wParam32, lParam, result ); if (dialog)
{
LRESULT result = GetWindowLongPtrW( hwnd32, DWLP_MSGRESULT );
result = WINPROC_UnmapMsg16To32A( hwnd32, msg32, wParam32, lParam, result );
SetWindowLongPtrW( hwnd32, DWLP_MSGRESULT, result );
}
else ret = WINPROC_UnmapMsg16To32A( hwnd32, msg32, wParam32, lParam, ret );
return ret;
} }
@ -3101,9 +3125,9 @@ static LRESULT WINPROC_CallProc16To32A( WNDPROC func, HWND16 hwnd, UINT16 msg,
* WINPROC_CallProc16To32W * WINPROC_CallProc16To32W
*/ */
static LRESULT WINPROC_CallProc16To32W( WNDPROC func, HWND16 hwnd, UINT16 msg, static LRESULT WINPROC_CallProc16To32W( WNDPROC func, HWND16 hwnd, UINT16 msg,
WPARAM16 wParam, LPARAM lParam ) WPARAM16 wParam, LPARAM lParam, BOOL dialog )
{ {
LRESULT result; LRESULT ret;
UINT msg32; UINT msg32;
WPARAM wParam32; WPARAM wParam32;
HWND hwnd32 = WIN_Handle32( hwnd ); HWND hwnd32 = WIN_Handle32( hwnd );
@ -3113,9 +3137,17 @@ static LRESULT WINPROC_CallProc16To32W( WNDPROC func, HWND16 hwnd, UINT16 msg,
if (WINPROC_MapMsg16To32W( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1) if (WINPROC_MapMsg16To32W( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0; return 0;
result = WINPROC_CallWndProc( func, hwnd32, msg32, wParam32, lParam );
return WINPROC_UnmapMsg16To32W( hwnd32, msg32, wParam32, lParam, result, ret = WINPROC_CallWndProc( func, hwnd32, msg32, wParam32, lParam );
func ); if (dialog)
{
LRESULT result = GetWindowLongPtrW( hwnd32, DWLP_MSGRESULT );
result = WINPROC_UnmapMsg16To32W( hwnd32, msg32, wParam32, lParam, result, NULL );
SetWindowLongPtrW( hwnd32, DWLP_MSGRESULT, result );
}
else ret = WINPROC_UnmapMsg16To32W( hwnd32, msg32, wParam32, lParam, ret, func );
return ret;
} }
@ -3125,8 +3157,8 @@ static LRESULT WINPROC_CallProc16To32W( WNDPROC func, HWND16 hwnd, UINT16 msg,
LRESULT WINAPI __wine_call_wndproc( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam, LRESULT WINAPI __wine_call_wndproc( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam,
WINDOWPROC *proc ) WINDOWPROC *proc )
{ {
if (proc->procA) return WINPROC_CallProc16To32A( proc->procA, hwnd, msg, wParam, lParam ); if (proc->procA) return WINPROC_CallProc16To32A( proc->procA, hwnd, msg, wParam, lParam, FALSE );
else return WINPROC_CallProc16To32W( proc->procW, hwnd, msg, wParam, lParam ); else return WINPROC_CallProc16To32W( proc->procW, hwnd, msg, wParam, lParam, FALSE );
} }
@ -3135,9 +3167,10 @@ LRESULT WINAPI __wine_call_wndproc( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LP
* *
* Call a 16-bit window procedure, translating the 32-bit args. * Call a 16-bit window procedure, translating the 32-bit args.
*/ */
static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND hwnd, static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND hwnd, UINT msg,
UINT msg, WPARAM wParam, LPARAM lParam ) WPARAM wParam, LPARAM lParam, BOOL dialog )
{ {
LRESULT ret;
UINT16 msg16; UINT16 msg16;
MSGPARAM16 mp16; MSGPARAM16 mp16;
@ -3147,10 +3180,21 @@ static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND hwnd,
mp16.lParam = lParam; mp16.lParam = lParam;
if (WINPROC_MapMsg32ATo16( hwnd, msg, wParam, &msg16, &mp16.wParam, &mp16.lParam ) == -1) if (WINPROC_MapMsg32ATo16( hwnd, msg, wParam, &msg16, &mp16.wParam, &mp16.lParam ) == -1)
return 0; return 0;
mp16.lResult = WINPROC_CallWndProc16( func, HWND_16(hwnd), msg16, ret = WINPROC_CallWndProc16( func, HWND_16(hwnd), msg16, mp16.wParam, mp16.lParam );
mp16.wParam, mp16.lParam ); if (dialog)
WINPROC_UnmapMsg32ATo16( hwnd, msg, wParam, lParam, &mp16 ); {
return mp16.lResult; mp16.lResult = GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
WINPROC_UnmapMsg32ATo16( hwnd, msg, wParam, lParam, &mp16 );
SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, mp16.lResult );
ret = LOWORD(ret);
}
else
{
mp16.lResult = ret;
WINPROC_UnmapMsg32ATo16( hwnd, msg, wParam, lParam, &mp16 );
ret = mp16.lResult;
}
return ret;
} }
@ -3159,9 +3203,10 @@ static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND hwnd,
* *
* Call a 16-bit window procedure, translating the 32-bit args. * Call a 16-bit window procedure, translating the 32-bit args.
*/ */
static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND hwnd, static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND hwnd, UINT msg,
UINT msg, WPARAM wParam, LPARAM lParam ) WPARAM wParam, LPARAM lParam, BOOL dialog )
{ {
LRESULT ret;
UINT16 msg16; UINT16 msg16;
MSGPARAM16 mp16; MSGPARAM16 mp16;
@ -3169,13 +3214,23 @@ static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND hwnd,
func, hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam); func, hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam);
mp16.lParam = lParam; mp16.lParam = lParam;
if (WINPROC_MapMsg32WTo16( hwnd, msg, wParam, &msg16, &mp16.wParam, if (WINPROC_MapMsg32WTo16( hwnd, msg, wParam, &msg16, &mp16.wParam, &mp16.lParam ) == -1)
&mp16.lParam ) == -1)
return 0; return 0;
mp16.lResult = WINPROC_CallWndProc16( func, HWND_16(hwnd), msg16, ret = WINPROC_CallWndProc16( func, HWND_16(hwnd), msg16, mp16.wParam, mp16.lParam );
mp16.wParam, mp16.lParam ); if (dialog)
WINPROC_UnmapMsg32WTo16( hwnd, msg, wParam, lParam, &mp16 ); {
return mp16.lResult; mp16.lResult = GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
WINPROC_UnmapMsg32WTo16( hwnd, msg, wParam, lParam, &mp16 );
SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, mp16.lResult );
ret = LOWORD(ret);
}
else
{
mp16.lResult = ret;
WINPROC_UnmapMsg32WTo16( hwnd, msg, wParam, lParam, &mp16 );
ret = mp16.lResult;
}
return ret;
} }
@ -3192,8 +3247,8 @@ LRESULT WINAPI CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
if (!(proc = handle16_to_proc( func ))) if (!(proc = handle16_to_proc( func )))
return WINPROC_CallWndProc16( func, hwnd, msg, wParam, lParam ); return WINPROC_CallWndProc16( func, hwnd, msg, wParam, lParam );
if (proc->procA) return WINPROC_CallProc16To32A( proc->procA, hwnd, msg, wParam, lParam ); if (proc->procA) return WINPROC_CallProc16To32A( proc->procA, hwnd, msg, wParam, lParam, FALSE );
if (proc->procW) return WINPROC_CallProc16To32W( proc->procW, hwnd, msg, wParam, lParam ); if (proc->procW) return WINPROC_CallProc16To32W( proc->procW, hwnd, msg, wParam, lParam, FALSE );
return WINPROC_CallWndProc16( proc->proc16, hwnd, msg, wParam, lParam ); return WINPROC_CallWndProc16( proc->proc16, hwnd, msg, wParam, lParam );
} }
@ -3237,8 +3292,8 @@ LRESULT WINAPI CallWindowProcA(
return WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam ); return WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
if (proc->procA) return WINPROC_CallWndProc( proc->procA, hwnd, msg, wParam, lParam ); if (proc->procA) return WINPROC_CallWndProc( proc->procA, hwnd, msg, wParam, lParam );
if (proc->procW) return WINPROC_CallProc32ATo32W( proc->procW, hwnd, msg, wParam, lParam ); if (proc->procW) return WINPROC_CallProc32ATo32W( proc->procW, hwnd, msg, wParam, lParam, FALSE );
return WINPROC_CallProc32ATo16( proc->proc16, hwnd, msg, wParam, lParam ); return WINPROC_CallProc32ATo16( proc->proc16, hwnd, msg, wParam, lParam, FALSE );
} }
@ -3258,8 +3313,8 @@ LRESULT WINAPI CallWindowProcW( WNDPROC func, HWND hwnd, UINT msg,
return WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam ); return WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
if (proc->procW) return WINPROC_CallWndProc( proc->procW, hwnd, msg, wParam, lParam ); if (proc->procW) return WINPROC_CallWndProc( proc->procW, hwnd, msg, wParam, lParam );
if (proc->procA) return WINPROC_CallProc32WTo32A( proc->procA, hwnd, msg, wParam, lParam ); if (proc->procA) return WINPROC_CallProc32WTo32A( proc->procA, hwnd, msg, wParam, lParam, FALSE );
return WINPROC_CallProc32WTo16( proc->proc16, hwnd, msg, wParam, lParam ); return WINPROC_CallProc32WTo16( proc->proc16, hwnd, msg, wParam, lParam, FALSE );
} }
@ -3275,8 +3330,8 @@ INT_PTR WINPROC_CallDlgProc16( DLGPROC16 func, HWND16 hwnd, UINT16 msg, WPARAM16
if (!(proc = handle16_to_proc( (WNDPROC16)func ))) if (!(proc = handle16_to_proc( (WNDPROC16)func )))
return LOWORD( WINPROC_CallWndProc16( (WNDPROC16)func, hwnd, msg, wParam, lParam ) ); return LOWORD( WINPROC_CallWndProc16( (WNDPROC16)func, hwnd, msg, wParam, lParam ) );
if (proc->procA) return WINPROC_CallProc16To32A( proc->procA, hwnd, msg, wParam, lParam ); if (proc->procA) return WINPROC_CallProc16To32A( proc->procA, hwnd, msg, wParam, lParam, TRUE );
if (proc->procW) return WINPROC_CallProc16To32W( proc->procW, hwnd, msg, wParam, lParam ); if (proc->procW) return WINPROC_CallProc16To32W( proc->procW, hwnd, msg, wParam, lParam, TRUE );
return LOWORD( WINPROC_CallWndProc16( proc->proc16, hwnd, msg, wParam, lParam ) ); return LOWORD( WINPROC_CallWndProc16( proc->proc16, hwnd, msg, wParam, lParam ) );
} }
@ -3294,8 +3349,8 @@ INT_PTR WINPROC_CallDlgProcA( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam,
return WINPROC_CallWndProc( (WNDPROC)func, hwnd, msg, wParam, lParam ); return WINPROC_CallWndProc( (WNDPROC)func, hwnd, msg, wParam, lParam );
if (proc->procA) return WINPROC_CallWndProc( proc->procA, hwnd, msg, wParam, lParam ); if (proc->procA) return WINPROC_CallWndProc( proc->procA, hwnd, msg, wParam, lParam );
if (proc->procW) return WINPROC_CallProc32ATo32W( proc->procW, hwnd, msg, wParam, lParam ); if (proc->procW) return WINPROC_CallProc32ATo32W( proc->procW, hwnd, msg, wParam, lParam, TRUE );
return LOWORD( WINPROC_CallProc32ATo16( proc->proc16, hwnd, msg, wParam, lParam ) ); return WINPROC_CallProc32ATo16( proc->proc16, hwnd, msg, wParam, lParam, TRUE );
} }
@ -3312,6 +3367,6 @@ INT_PTR WINPROC_CallDlgProcW( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam,
return WINPROC_CallWndProc( (WNDPROC)func, hwnd, msg, wParam, lParam ); return WINPROC_CallWndProc( (WNDPROC)func, hwnd, msg, wParam, lParam );
if (proc->procW) return WINPROC_CallWndProc( proc->procW, hwnd, msg, wParam, lParam ); if (proc->procW) return WINPROC_CallWndProc( proc->procW, hwnd, msg, wParam, lParam );
if (proc->procA) return WINPROC_CallProc32WTo32A( proc->procA, hwnd, msg, wParam, lParam ); if (proc->procA) return WINPROC_CallProc32WTo32A( proc->procA, hwnd, msg, wParam, lParam, TRUE );
return LOWORD( WINPROC_CallProc32WTo16( proc->proc16, hwnd, msg, wParam, lParam )); return WINPROC_CallProc32WTo16( proc->proc16, hwnd, msg, wParam, lParam, TRUE );
} }