我需要识别当前运行的Excel进程ID,以便将其与其他Excel进程ID进行比较,以便我可以删除其他非当前Excel进程。这是我的,但没有进程ids =当前id。我做错了什么?
Declare Function GetCurrentProcessId Lib "kernel32" () As Int32
Private Sub CheckMemory()
Dim process As Process
Dim xlProcessCount = process.GetProcessesByName("EXCEL").Count()
Dim curProc As IntPtr = GetCurrentProcessId()
Dim currentProcess As Process = process.GetProcessById(curProc)
If xlProcessCount > 1 Then
' MsgBox("There are " + xlProcessCount + "Excel processes running", MsgBoxStyle.Information)
'Associate the current active "Excel.exe" process with this application instance
'and delete the other running processes
Dim current = process.GetCurrentProcess()
For Each process In process.GetProcessesByName("EXCEL")
If process.Id <> currentProcess.Id Then
MsgBox("Deleting a previous running Excel process", MsgBoxStyle.Information)
process.Kill()
' releaseObject(xlApp)
' releaseObject(xlWb)
' releaseObject(xlWs)
End If
Next
End If
答案 0 :(得分:0)
要直接回答您的问题,您的代码“无效”,因为您的流程不是Excel流程。 GetCurrentProcessId()
返回的进程ID是EXE的ID,而不是Excel。所有Excel实例(甚至是您的应用程序启动的实例)都是不同的进程,因此它们的进程ID永远不会与您的进程ID相匹配。
现在回答您的问题 - 您需要做的是确保正确清理Excel实例。
最好的方法是根本不自动化Excel,而是使用可以创建Excel文件的库。有关示例,请参阅此问题的答案:Create Excel (.XLS and .XLSX) file from C#
如果由于某种原因需要使用Excel,则必须确保清理Excel应用程序返回的每个对象。一般规则是:
.
- 您需要存储对Excel返回的每个对象的引用。Marhsal.ReleaseObject
手动释放所有Excel COM对象。有关详细信息,请参阅此问题How do I properly clean up Excel interop objects?。