Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何获取Word实例或Hwnd属性的PID(进程ID)?_Asp.net_Vb.net_Ms Word_Interop_Hwnd - Fatal编程技术网

Asp.net 如何获取Word实例或Hwnd属性的PID(进程ID)?

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

我正在寻找一种更好的编码方法,通过获取其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 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应该完全清楚,因为有更好的方法在服务器上生成电子表格。