- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何从正在运行的对象获取进程 ID?
Dim xlApp As Object = CreateObject("Excel.Application")
我需要使用后期绑定(bind),因为我无法保证我将获得哪个版本,因此使用 Microsoft.Office.Interop.Excel
不起作用。
'do some work with xlApp
xlApp.Quit
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = nothing
此时Excel仍在后台运行。我熟悉使用变量并释放它们然后使用的所有建议:System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
。这不能可靠地工作。我正在做的工作非常复杂。我使用每个循环等使用多个文件。释放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 对象,因为它们仅在使用早期绑定(bind)时起作用。例如。 Microsoft.Office.Interop.Excel
如何从正在运行的对象获取进程 ID?
编辑:实际上,我对如何让 Excel 很好地退出并不是很感兴趣。许多其他问题已经解决了这个问题。 here和 here我只想杀了它;干净、准确、直接。我想杀死我启动的确切进程,而不是其他进程。
最佳答案
其实没关系;我想到了。这是一个非常干净、目标明确的解决方案,可以杀死已启动的确切进程。它不会干扰用户可能打开的任何其他进程或文件。根据我的经验,关闭文件并退出 Excel 后终止进程是处理 Excel 的最快、最简单的方法。 Here is a knowledge Base article描述问题和 Microsoft 建议的解决方案。
请注意,此解决方案不会终止 Excel 应用程序。如果没有正确处理任何指针,它只会杀死空进程 shell。当我们调用 xlApp.quit() 时,Excel 本身实际上会退出。这可以通过尝试附加正在运行的 Excel 应用程序来确认,但由于 Excel 根本没有运行,该应用程序将会失败。
很多人不建议终止进程;看 How to properly clean up Excel interop objects和 Understanding Garbage Collection in .net
另一方面,很多人不推荐使用 GC.Collect。请参阅What's so wrong about using GC.Collect()?
请务必关闭所有打开的工作簿,退出应用程序,释放 xlApp 对象。最后检查进程是否仍然存在,如果存在则终止它。
Private Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As IntPtr, _
ByRef lpdwProcessId As Integer) As Integer
Sub testKill()
'start the application
Dim xlApp As Object = CreateObject("Excel.Application")
'do some work with Excel
'close any open files
'get the window handle
Dim xlHWND As Integer = xlApp.hwnd
'this will have the process ID after call to GetWindowThreadProcessId
Dim ProcIdXL As Integer = 0
'get the process ID
GetWindowThreadProcessId(xlHWND, ProcIdXL)
'get the process
Dim xproc As Process = Process.GetProcessById(ProcIdXL)
'Quit Excel
xlApp.quit()
'Release
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
'set to nothing
xlApp = Nothing
'kill it with glee
If Not xproc.HasExited Then
xproc.Kill()
End If
End Sub
一旦我意识到我可以从 Excel 获取窗口句柄,那么我只需要该函数从窗口句柄获取进程 ID。因此 GetWindowThreadProcessId
如果有人知道 vb.net 的方法来获取它,我将不胜感激。
关于vb.net - 如何从创建的 "Excel.Application"对象中获取进程 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17759085/
我是一名优秀的程序员,十分优秀!