Исключение при подклассе Excel 2010 в .NET.

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

Interesting Posts

Использование R для переформатирования данных из перекрестного вклада в формат с одной базой данных

Импорт самых последних писем из Outlook в Excel (VBA)

SQL Server 2005 Передача данных SSIS SQL в Excel искажает файл Excel

Как отправить напоминание электронной почты из кода

Пользовательский расчет на основе данных сводной таблицы

Поиск индекса Excel с использованием символа подстановки («*»)

Настройка заголовков столбцов при добавлении столбцов в таблицу через макрос в Excel

Несколько конкатенатов – VBA

Как перемещаться по диапазону ячеек, когда известен только столбец с помощью Excel VBA?

Сохранение рабочего листа Excel как файла PDF только для чтения?

Вопрос с Excel и вкладкой с разделителями

VBA – создание, редактирование и гиперссылка

Как использовать openpyxl для вставки одного листа в шаблон?

VBA отлично справляется с исследователем

База данных с несколькими значениями для одного и того же идентификатора

Давайте будем гением компьютера.