Vb.net 识别当前正在运行的进程
我需要识别当前运行的Excel进程id,以便将其与其他Excel进程id进行比较,以便删除其他非当前Excel进程。这是我所拥有的,但没有一个进程id=当前id。我做错了什么Vb.net 识别当前正在运行的进程,vb.net,Vb.net,我需要识别当前运行的Excel进程id,以便将其与其他Excel进程id进行比较,以便删除其他非当前Excel进程。这是我所拥有的,但没有一个进程id=当前id。我做错了什么 将函数GetCurrentProcessId Lib“kernel32”()声明为Int32 Private Sub CheckMemory() Dim process As Process Dim xlProcessCount = process.GetProcessesByName("EXCEL").C
将函数GetCurrentProcessId Lib“kernel32”()声明为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
专用子校验存储器()
作为过程的Dim过程
Dim xlProcessCount=process.getProcessByName(“EXCEL”).Count()
Dim curProc As IntPtr=GetCurrentProcessId()
Dim currentProcess As Process=Process.GetProcessById(curProc)
如果xlProcessCount>1,则
'MsgBox(“有“+xlProcessCount+”Excel进程正在运行”,MsgBoxStyle.Information)
'将当前活动的“Excel.exe”进程与此应用程序实例关联
'并删除其他正在运行的进程
Dim current=process.GetCurrentProcess()
对于process.GetProcessesByName(“EXCEL”)中的每个进程
如果process.Id currentProcess.Id,则
MsgBox(“删除以前运行的Excel进程”,MsgBoxStyle.Information)
process.Kill()
'释放对象(xlApp)
'释放对象(xlWb)
'释放对象(xlWs)
如果结束
下一个
如果结束
要直接回答您的问题,您的代码“不起作用”,因为您的流程不是Excel流程。
GetCurrentProcessId()
返回的进程ID是EXE的ID,它不是Excel。所有Excel实例(即使是应用程序启动的实例)都是不同的进程,因此它们的进程ID永远不会与您的进程ID匹配
现在回答您的问题-您需要做的是确保正确清理Excel实例
实现这一点的最佳方法是完全不自动化Excel,而是使用可以创建Excel文件的库。有关一些示例,请参见此问题的答案:
如果出于某种原因需要使用Excel,则必须确保清除Excel应用程序返回的每个对象。这方面的一般规则是:
——您需要存储对Excel返回的每个对象的引用Marhsal.ReleaseObject
手动释放所有Excel COM对象有关更多详细信息,请参阅此问题。我们似乎已经走了一半,事情已经出了问题,您正在生成多个Excel进程并将其泄漏,您已经决定正确的修复方法是让泄漏继续,但要不断地将其清除。如果不是这样,您能否解释一下“当前活动”excel实例是什么,为什么它是特殊的,以及您通常尝试执行的操作。您当前的代码是否通过VSTO或类似方式在excel中运行?“当前运行”没有任何意义,excel.exe的所有副本都与当前运行的一样。COM不提供识别服务器的机制。GetCurrentProcessId()肯定不会工作,这是您的过程,永远不会出类拔萃。编写这样的代码是另一个问题的创可贴。现在你有两个问题Damien…你说得对。我注意到,如果应用程序未正确关闭或其他未检查的异常导致它,应用程序可能会产生多个进程。事情还没有出问题,但我正试图通过删除非当前Excel进程来防止内存泄漏的发生,这可能是最好的方法,也可能不是最好的方法。我可能首先需要防止内存泄漏的发生。我愿意接受有关如何处理此问题的建议。好的,谢谢shf301。。。我正在查看链接以及从该链接生成的链接。我想我可能有个解决办法。