Исключение при создании подкласса Excel 2010 в .NET - PullRequest
1 голос
/ 07 декабря 2011

Я попытался создать подкласс главного окна Excel 2010 из надстройки VSTO.Это приводит к исключению и сбою Excel при закрытии программы.

Поэтому я создал небольшой пример, который воспроизводит ошибку на моем компьютере.Очевидно, что вызов CallWindowProc генерирует исключение ThreadAbortException при вызове для WM_CLOSE.

Public Class ThisAddIn

Private Const GWL_WNDPROC As Integer = -4

Private Delegate Function WndProcDelegate( _
    ByVal hWnd As IntPtr, _
    ByVal msg As Int32, _
    ByVal wParam As Int32, _
    ByVal lParam As Int32) As Int32

Private Declare Function SetWindowLong _
    Lib "user32.dll" Alias "SetWindowLongA" ( _
        ByVal hWnd As IntPtr, _
        ByVal nIndex As Int32, _
        ByVal dwNewLong As IntPtr) As Int32

Private Declare Function SetWindowLong _
    Lib "user32.dll" Alias "SetWindowLongA" ( _
        ByVal hWnd As IntPtr, _
        ByVal nIndex As Int32, _
        ByVal dwNewLong As WndProcDelegate) As IntPtr

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As IntPtr, ByVal hWnd As IntPtr, ByVal msg As Integer, _
     ByVal wParam As Integer, ByVal lParam As Integer) As Integer

<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.FunctionPtr)> _
    Private mWndProc As WndProcDelegate

Private mPrevWindowProc As IntPtr

Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
    mWndProc = New WndProcDelegate(AddressOf SubWndProc)

    mPrevWindowProc = SetWindowLong(New IntPtr(Application.Hwnd), GWL_WNDPROC, mWndProc)
End Sub

Private Sub ThisAddIn_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown
    SetWindowLong(New IntPtr(Application.Hwnd), GWL_WNDPROC, mPrevWindowProc)
End Sub

Private Function SubWndProc( _
        ByVal hWnd As IntPtr, _
        ByVal msg As Int32, _
        ByVal wParam As Int32, _
        ByVal lParam As Int32) As Int32

    Try
        Return CallWindowProc(mPrevWindowProc, hWnd, msg, wParam, lParam)
    Catch ex As Exception
        Windows.Forms.MessageBox.Show(ex.ToString)
    End Try
End Function

End Class

Это просто происходит на моей машине или я делаю что-то не так?

Кстати, это не имеет значения, если явосстановить WndProc в событии WM_CLOSE или WM_DESTROY, Excel все равно падает.

Excel 2010, Windows XP, VS 2008

...