diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c index a5425467d7..28fb2e9fa5 100644 --- a/dlls/msi/dialog.c +++ b/dlls/msi/dialog.c @@ -3429,6 +3429,9 @@ void msi_dialog_destroy( msi_dialog *dialog ) if( dialog->hwnd ) DestroyWindow( dialog->hwnd ); + /* unsubscribe events */ + ControlEvent_CleanupDialogSubscriptions(dialog->package, dialog->name); + /* destroy the list of controls */ while( !list_empty( &dialog->controls ) ) { diff --git a/dlls/msi/events.c b/dlls/msi/events.c index 4ddab41729..714e060ae1 100644 --- a/dlls/msi/events.c +++ b/dlls/msi/events.c @@ -54,7 +54,6 @@ struct subscriber { }; static UINT ControlEvent_HandleControlEvent(MSIPACKAGE *, LPCWSTR, LPCWSTR, msi_dialog*); -static VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog); /* * Create a dialog box and run it if it's modal @@ -321,7 +320,7 @@ VOID ControlEvent_FireSubscribedEvent( MSIPACKAGE *package, LPCWSTR event, } } -static VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog) +VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog) { struct list *i, *t; struct subscriber *sub; diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index b01bb27ebe..971f71ef51 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -781,6 +781,7 @@ extern void msi_ui_error( DWORD msg_id, DWORD type ); /* control event stuff */ extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event, MSIRECORD *data); +extern VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog); extern VOID ControlEvent_CleanupSubscriptions(MSIPACKAGE *package); extern VOID ControlEvent_SubscribeToEvent(MSIPACKAGE *package, msi_dialog *dialog, LPCWSTR event, LPCWSTR control, LPCWSTR attribute);