我确定这看起来像一个奇怪的问题,但是我的一个客户遇到Excel随机崩溃的问题并且在我的C#程序使用Excel时出现错误消息"Microsoft Excel已停止工作"(问题事件名称:APPCRASH)无形的),我正在尝试复制问题所以我可以找到一种方法让我的程序处理Excel崩溃.所以我需要一些VBA代码,这会导致Excel崩溃APPCRASH事件.我尝试了以下,但除非Excel可见,否则不会导致崩溃.有什么建议?
Do
x = 1
Loop
Run Code Online (Sandbox Code Playgroud)
将手伸进它的东西,扭转它们,抓住柔软和松软的东西,然后把它撕掉.
这应该做的伎俩:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC As Long = (-4)
'SAVE YOUR WORK!
Private Sub BuhBye()
Dim hWnd As Long
hWnd = FindWindow(vbNullString, Application.Caption)
SetWindowLong hWnd, GWL_WNDPROC, AddressOf OopsIDivedItAgain
End Sub
Public Function OopsIDivedItAgain(ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
OopsIDivedItAgain = 1 / 0
End Function
Run Code Online (Sandbox Code Playgroud)
它基本上是Excel主窗口的子类,故意从消息泵内部抛出.
这很可能是一个XY问题.
解决这个问题的方法不是弄清楚一些随机的VBA代码可以获得类似的APPCRASH事件日志条目 - 没有人会这样做.或者,如果有的话,那么你无论如何都不会学到任何新东西.
解决问题的方法是将VS调试器附加到EXCEL.EXE进程,重现用户步骤,然后在C#代码中查看VS中断未处理的异常.
很可能你得到了一个COMException地方,你的Excel实例突然因此而死,并且在产生EXCEL.EXE进程的托管代码中编写了一个APPCRASH,它是在进程外发生的异常的副作用.
确保您的C#代码正确释放它正在访问的所有COM对象(即每个单元Worksheet,Range/ cells,Worksheets集合,Application实例),并且不链接对象成员调用(导致内存泄漏),例如:
xlApp.Worksheets("foo").Range("A1").Value = 42;
Run Code Online (Sandbox Code Playgroud)
以上是泄漏Worksheets集合,Worksheet实例和Range访问的单元格.
托管和COM线程模型也不完全兼容,因此如果您的C#代码正在从多个线程访问COM对象,那么期望COMException更好.
首先要做的是用附加的调试器重现问题,看看你的C#代码是否抛出异常.试图找到一些会崩溃Excel的VBA代码对任何事情都无济于事.
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |