识别当前正在运行的进程

时间:2013-06-11 16:55:11

标签: vb.net

我需要识别当前运行的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

1 个答案:

答案 0 :(得分:0)

要直接回答您的问题,您的代码“无效”,因为您的流程不是Excel流程。 GetCurrentProcessId()返回的进程ID是EXE的ID,而不是Excel。所有Excel实例(甚至是您的应用程序启动的实例)都是不同的进程,因此它们的进程ID永远不会与您的进程ID相匹配。

现在回答您的问题 - 您需要做的是确保正确清理Excel实例。

最好的方法是根本不自动化Excel,而是使用可以创建Excel文件的库。有关示例,请参阅此问题的答案:Create Excel (.XLS and .XLSX) file from C#

如果由于某种原因需要使用Excel,则必须确保清理Excel应用程序返回的每个对象。一般规则是:

  1. 永远不要在通话中使用超过. - 您需要存储对Excel返回的每个对象的引用。
  2. 使用Marhsal.ReleaseObject手动释放所有Excel COM对象。
  3. 有关详细信息,请参阅此问题How do I properly clean up Excel interop objects?