views:

99

answers:

1

Hi all!

I have written an Excel COM Add-In in C++ for automation of Excel with VBA. It contains an own dialog showing some general informations about the Add-In. Now i create a button in Excel that opens the dialog. Leaving the dialog with the escape key leads to an Excel message that the script is being interrupted instead of just closing the dialog. I could suppress the interruption message with:

Application.EnableCancelKey = xlDisabled

But that seems not to be the solution as the script can not be interrupted any more.
Here is an example how i use VBA to open the dialog:

Private Sub ShowAboutDialog_Click()
  Dim oComAddIn As COMAddIn
  Set oComAddIn = Application.COMAddIns.Item("MyComAddIn.Example")
  oComAddIn.Connect = True
  Call oComAddIn.Object.ShowAboutDlg
End Sub

My guess is that the problem is somewhere in the message handler of the dialog:

INT_PTR CALLBACK CAboutDialog::AboutDlg(
   HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    ...
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
        {
            // Here, the ESCAPE key should also be trapped?
            EndDialog(hwndDlg, LOWORD(wParam));
            return TRUE;
        }
    ...
    }

    return FALSE;
}

The Dialog is created with:

DialogBox(g_hModule, MAKEINTRESOURCE(IDD_ABOUT), hWndParent, (DLGPROC)AboutDlg)

Thanks a lot!

A: 

Dialogs should return their exit status to the calling routine rather than allowing to terminate code execution. So I suggest you to

  • convert your ShowAboutDlg from a Sub() to a Function()
  • returning a constant out of the VbMsgBoxResult Enum set (avoid hardcoding!)
  • trap the ESC key in your dialog and return a VbCancel (or VbAbort)

Good luck MikeD

MikeD