From 30ddf73954148e579ba7db134c591af63d84e193 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Wed, 6 Jul 2005 11:11:26 +0000 Subject: [PATCH] Don't crash when cancelling out of a modeless dialog. --- dlls/msi/events.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/dlls/msi/events.c b/dlls/msi/events.c index 6d6682bb91f..1c44b9577b2 100644 --- a/dlls/msi/events.c +++ b/dlls/msi/events.c @@ -57,21 +57,23 @@ UINT ControlEvent_HandleControlEvent(MSIPACKAGE *, LPCWSTR, LPCWSTR, msi_dialog* /* * Create a dialog box and run it if it's modal */ -static UINT event_do_dialog( MSIPACKAGE *package, LPCWSTR name ) +static UINT event_do_dialog( MSIPACKAGE *package, LPCWSTR name, BOOL destroy_modeless ) { msi_dialog *dialog; UINT r; - /* kill the current modeless dialog */ - if( package->dialog ) - msi_dialog_destroy( package->dialog ); - package->dialog = NULL; - /* create a new dialog */ dialog = msi_dialog_create( package, name, ControlEvent_HandleControlEvent ); if( dialog ) { + /* kill the current modeless dialog */ + if( destroy_modeless && package->dialog ) + { + msi_dialog_destroy( package->dialog ); + package->dialog = NULL; + } + /* modeless dialogs return an error message */ r = msi_dialog_run_message_loop( dialog ); if( r == ERROR_SUCCESS ) @@ -139,7 +141,8 @@ static UINT ControlEvent_NewDialog(MSIPACKAGE* package, LPCWSTR argument, static UINT ControlEvent_SpawnDialog(MSIPACKAGE* package, LPCWSTR argument, msi_dialog *dialog) { - event_do_dialog( package, argument ); + /* don't destroy a modeless dialogs that might be our parent */ + event_do_dialog( package, argument, FALSE ); if( package->CurrentInstallState != ERROR_SUCCESS ) msi_dialog_end_dialog( dialog ); return ERROR_SUCCESS; @@ -339,13 +342,13 @@ UINT ACTION_DialogBox( MSIPACKAGE* package, LPCWSTR szDialogName ) * dialog, as it returns ERROR_IO_PENDING when we try to run * its message loop. */ - r = event_do_dialog( package, szDialogName ); + r = event_do_dialog( package, szDialogName, TRUE ); while( r == ERROR_SUCCESS && package->next_dialog ) { LPWSTR name = package->next_dialog; package->next_dialog = NULL; - r = event_do_dialog( package, name ); + r = event_do_dialog( package, name, TRUE ); HeapFree( GetProcessHeap(), 0, name ); }