Asp.net 如何获取Word实例或Hwnd属性的PID(进程ID)?
我正在寻找一种更好的编码方法,通过获取其PID进程ID,就像在Excel中获取PID一样,来正确关闭我的应用程序中的WINWORD.EXE或word进程 这是我使用Hwnd属性和GetProcessID类获取Excel PID的示例Asp.net 如何获取Word实例或Hwnd属性的PID(进程ID)?,asp.net,vb.net,ms-word,interop,hwnd,Asp.net,Vb.net,Ms Word,Interop,Hwnd,我正在寻找一种更好的编码方法,通过获取其PID进程ID,就像在Excel中获取PID一样,来正确关闭我的应用程序中的WINWORD.EXE或word进程 这是我使用Hwnd属性和GetProcessID类获取Excel PID的示例 Imports System.Diagnostics Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Integer, ByRef lpdwProcessI
Imports System.Diagnostics
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Integer, ByRef lpdwProcessId As IntPtr) As IntPtr
Public Sub CreateNewFromTemplate_Excel()
' Create Excel Application, Workbook, and WorkSheets
Dim xlExcel As Excel.Application = New Excel.Application
'Getting the process ID of excel application
Dim processId As IntPtr = Nothing
GetWindowThreadProcessId(xlExcel.Hwnd, processId)
Dim excelProcess As Process = Process.GetProcessById(processId.ToInt32())
Dim blError As Boolean = False
Try
[Perform Excel generation here.]
' Make sure all objects are disposed
xlBook.Close()
xlExcel.Quit()
Catch ex As Exception
blError = True
If Not excelProcess.HasExited Then excelProcess.Kill() ' End the specific Excel Process ID if not yet closed.
Throw
Finally
If Not blError Then
If Not excelProcess.HasExited Then excelProcess.Kill() ' End the specific Excel Process ID if not yet closed.
End If
End Try
End Sub
这是我关闭Word Process/WINWORD.EXE的代码,但不幸的是,它在服务器端不起作用,因此我正在寻找一种方法和代码来获取Word Process ID以正确关闭它
Marshal.ReleaseComObject(rng)
Dim strFileName As String = comm.GenerateFilename(strUser_Id, strVPN) & ".docx"
' Save the document.
Dim filename As Object = Path.GetFullPath(strNewFilePath & strFileName)
newDoc.SaveAs(FileName:=filename)
' Close.
Dim save_changes As Object = False
newDoc.Close(save_changes)
WordApp.Quit(save_changes)
Marshal.ReleaseComObject(newDoc)
Marshal.ReleaseComObject(WordApp)
rng = Nothing
newDoc = Nothing
WordApp = Nothing
' Let GC know about it
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
' save the file to database
SaveFormat(filename, strUser_Id, strFamilyId.Trim, strVPN.Trim, DateTime.Now.ToString(), "application/vnd.ms-word", br_id, "doc")
If File.Exists(filename) Then
File.Delete(filename)
End If
任何人都可以就如何获取Word实例的PID或Hwnd属性提出编码的最佳方法或最佳实践吗。谢谢:您正在尝试的工作可能不会像预期的那样可靠。如果您需要从服务器端处理文档和电子表格,我强烈建议您切换到OpenXML或其他库
我倾向于使用EPPlus,它工作得非常好,几乎与VBA/Interop的代码相同
在继续之前,我将阅读Microsoft的以下警告和文章:
所有当前版本的Microsoft Office都经过设计、测试和配置,可以作为最终用户产品在客户端工作站上运行。他们假设一个交互式桌面和用户配置文件。它们不提供满足设计为无人值守运行的服务器端组件需要的可重入性或安全性级别
Microsoft目前不建议也不支持从任何无人参与、非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为在该环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁
看看这里,这是一个很好的阅读,你会找到你的答案。我实际上遇到了这篇文章。我不太理解编写的代码,但我会再试一次,希望它能工作。顺便说一句,谢谢你:你想做的事是行不通的。这是一个ludacris的声明。我可以证明这个陈述是错误的,你能提供什么样的案例来验证你的陈述?请告诉我们?@Zaggler官方的微软链接还不够吗?这一过程不可靠,显然不是最佳做法。如果OP真的想在ASP.NET上实现互操作,这是他的特权,但微软明确表示,出于各种原因,他应该避开。我肯定有很多关于堆栈溢出的文章。我理解并同意最佳实践,但您没有回答我的问题。你能提供一个清晰的测试用例来解释为什么这不起作用吗?“到目前为止,我还没有看到一个。”扎格勒我编辑了我的答案,因为这个过程可能会工作,但它会可靠地工作吗?由于这种可变性,这里没有人会得到这个问题的答案。我没有一个明确的测试用例,但是在无人参与的情况下使用Interop有很多问题。做研究。对我来说,这和它不起作用一样好。OP应该完全清楚,因为有更好的方法在服务器上生成电子表格。