我确定这似乎是一个奇怪的问题,但是我的一个客户遇到了Excel随机崩溃的问题,并在我的C#程序处于运行状态时给出错误消息“ Microsoft Excel已停止工作”(问题事件名称:APPCRASH)使用Excel(无形),并且我正在尝试重复该问题,以便为我的程序找出解决Excel崩溃的方法。因此,我需要一些VBA代码,这些代码将导致Excel因APPCRASH事件而崩溃。我尝试了以下操作,但是除非可见Excel,否则它不会导致崩溃。有什么建议吗?
Do
x = 1
Loop
答案 0 :(得分:8)
将手伸进去,扭动它们,抓紧柔软的东西,然后将其撕裂。
这应该可以解决问题:
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
它基本上是Excel主窗口的子类,并有意从消息泵内部抛出。
答案 1 :(得分:5)
这很可能是X-Y问题。
解决此问题的方法不是找出一些可以使您获得类似APPCRASH事件日志条目的随机VBA代码-不会。或者,如果有的话,那么您无论如何都不会学到任何新知识。
解决问题的方法是将VS调试器附加到EXCEL.EXE进程,重现用户步骤,然后观察VS在C#代码中未处理的异常上中断。
您很有可能在某个地方遇到COMException
,因此Excel实例突然死亡,并在托管代码中写入了APPCRASH,该异常是进程外发生的异常的副作用产生了EXCEL.EXE进程。
确保您的C#代码正确释放了它正在访问的所有COM对象(每个Worksheet
,Range
/ cell,Worksheets
集合,Application
实例),并且't链接对象成员调用(导致内存泄漏),例如:
xlApp.Worksheets("foo").Range("A1").Value = 42;
上面泄漏了Worksheets
集合,Worksheet
实例和访问的单元格的Range
。
托管线程模型和COM线程模型也不完全兼容,因此,如果您的C#代码正在从多个线程访问COM对象,那么请期待COMException
。
要做的第一件事是重现附带调试器的问题,并查看您的C#代码是否引发异常。试图找到一些会使Excel崩溃的VBA代码并不能解决任何问题。