我有一些我在这个网站上找到的代码似乎在大多数时候都很好用。
以下是代码:
Private Function GetProcessOwner(processId As Integer) As String
Try
Dim query = "Select * From Win32_Process Where ProcessID = " & processId
Dim searcher = New ManagementObjectSearcher(query)
Dim processList = searcher.Get()
For Each obj As ManagementObject In processList
Dim argList As String() = {String.Empty, String.Empty}
Dim returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList))
If returnVal = 0 Then
Return argList(1) & "\" & argList(0)
End If
Next
Catch ex As Exception
End Try
Return ""
End Function
然而,有时候我得到了这个:
RuntimeCallableWrapper avec l'erreur suivante : Un appel sortant ne peut pas être effectué étant donné que l’application répartit un appel entrant synchrone. (Exception de HRESULT : 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL)). Cela se produit habituellement car le contexte COM 0x78e910 dans lequel ce RuntimeCallableWrapper a été créé a été déconnecté ou est occupé à autre chose et ne peut pas traiter la transition des contextes. Aucun proxy ne sera utilisé pour traiter la demande sur le composant COM. Cela peut entraîner des dysfonctionnements ou des pertes de données. Pour éviter ce problème, assurez-vous que tous les contextes/cloisonnements/threads COM restent actifs et sont disponibles pour la transition des contextes, tant que l'application n'en a pas terminé avec les RuntimeCallableWrappers qui représentent les composants COM qui s'y trouvent.
用法语,但我不能用自己的语言理解它,所以我无法真正翻译。任何人都可以告诉我,我做错了,该怎么做才能纠正它?
我发现有另一种方法可以让流程所有者(http://www.codeproject.com/Articles/14828/How-To-Get-Process-Owner-ID-and-Current-User-SID),但它在c#中,整个项目都在VB中。另外,当我复制代码时,我会在单词HANDLE上收到编译错误。我不介意使用这个代码,但我不能让它工作
有人能帮助我吗?
Thsnks
答案 0 :(得分:1)
当ManagementObjectSearcher实现IDisposable时,我会使用Using块创建(并处理)它,如下所示:
使用searcher作为新的ManagementObjectSearcher(查询) [...] 结束使用
这将确保搜索者得到妥善处理,因为它引用了非托管资源。 (之前的搜索者可能是您遇到问题的原因。)