如何从正在运行的对象获取进程ID
Dim xlApp As Object=CreateObject(“Excel.Application”)
我需要使用后期绑定,因为我无法保证将获得哪个版本,因此使用Microsoft.Office.Interop.Excel将无法工作
'使用xlApp做一些工作
xlApp.退出
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp=无
此时Excel仍在后台运行。我熟悉使用变量并释放它们然后使用的所有建议:System.Runtime.InteropServices.marshall.ReleaseComObject(o)。这不可靠。我正在做的工作很复杂。我使用for each循环等方法使用多个文件。不可能释放Excel中的所有资源。我需要一个更好的选择
我想在Excel上使用Process.Kill,但我不知道如何从xlApp对象获取进程。我不想终止所有Excel进程,因为用户可能打开了工作簿
我尝试使用Dim xProc As Process=Process.Start(ExcelPath)然后使用xProc.Kill()这有时会起作用,除了使用XLApp=GetObject(“Book1”).Application或XLApp=GetObject(“,“Excel.Application”)获取正确的Excel对象有点棘手之外如果用户已打开Excel窗口。我需要一个更好的选择
我无法使用GetActiveObject或BindToMoniker获取Excel对象,因为它们仅在使用早期绑定时使用work。例如Microsoft.Office.Interop.Excel
如何从正在运行的对象获取进程ID
编辑:事实上,我对重新讨论如何让Excel很好地退出并不感兴趣。许多其他问题已经解决了这一问题。在这里和这里,我只想杀死它;干净、准确、直接。我想杀死我开始的那个过程,而不是别的
其实没关系;我想出来了。这是一个非常干净、目标明确的解决方案,它扼杀了启动的确切过程。它不会干扰用户可能已打开的任何其他进程或文件。根据我的经验,在关闭文件并退出Excel后终止进程是处理Excel最快、最简单的方法。下面是一篇知识库文章,介绍了该问题和Microsoft推荐的解决方案
请注意,此解决方案不会终止Excel应用程序。只有在没有正确处理任何指针的情况下,它才会杀死空的进程外壳。当我们调用xlApp.quit()时,Excel本身确实会退出。这可以通过尝试附加正在运行的Excel应用程序来确认,该应用程序将失败,因为Excel根本没有运行
许多人不建议终止进程;看见
如何正确清理Excel互操作对象
了解.net中的垃圾收集
另一方面,许多人不建议使用GC.Collect。看看使用GC.Collect()有什么不对吗
确保关闭所有打开的工作簿,退出应用程序,释放xlApp对象。最后检查进程是否仍然处于活动状态,如果仍然处于活动状态,则将其杀死
私有声明自动函数GetWindowThreadProcessId库“user32.dll”(ByVal hwnd作为IntPtr_
ByRef lpdwProcessId(作为整数)作为整数
子testKill()
'启动应用程序
Dim xlApp As Object=CreateObject(“Excel.Application”)
“使用Excel做一些工作
'关闭所有打开的文件
“拿窗把手
Dim xlHWND为整数=xlApp.hwnd
'在调用GetWindowThreadProcessId之后,它将具有进程ID
Dim ProcIdXL为整数=0
'获取进程ID
GetWindowThreadProcessId(xlHWND,ProcIdXL)
“了解流程
Dim xproc As Process=Process.GetProcessById(ProcIdXL)
'退出Excel
xlApp.quit()
"释放",
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
“一事无成
xlApp=无
“高兴地杀了它
如果未退出xproc.has,则
xproc.Kill()
如果结束
端接头
一旦我意识到我可以从Excel获取窗口句柄,那么我只需要这个函数从窗口句柄获取进程ID。因此GetWindowThreadProcessId如果有人知道用vb.net的方式来获取,我将不胜感激