Я попытался создать подкласс главного окна 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