我们需要弄清楚服务如何查看正在运行的VB6应用程序和/或其DCOM生成的exe,并找出哪个VB6应用程序与哪个DCOM exe。 VB6应用程序和衍生的exe都在同一台服务器上。
我们有一个VB6应用程序,它通过CreateObject()调用生成一个Bartender实例(来自Seagull Scientific)。在给定的服务器上,我们可能有10或20个应用程序实例,每个实例代表仓库中的手持RF枪客户端。这些VB6应用程序的95%或更多将拥有自己的调酒师。
由于我们无法控制的情况,随机地,我们的一个VB6实例将被杀死,就像你使用任务管理器杀死它一样。这让它的调酒师仍然活着并消耗资源。在几个小时或几天的时间内杀死了五十个左右,这些孤儿的调酒师变得足够资源,使服务器瘫痪。
我们正在尝试开发一个观察者服务来检测哪些调酒师仍然连接,所以这项新服务可以杀死孤儿调酒师。我们正在尝试在不更改VB6应用程序的情况下完成此操作,但如果必须,我们将修改我们的应用程序。
答案 0 :(得分:0)
我认为routine恰如其分地命名为“你的爸爸是谁”,可能对你有用。它弄清楚是谁催生了这个过程。它可能无法解决您的整个问题,但这是一个开始。
答案 1 :(得分:0)
要做到这一点,即使不是不可能,也很难。进程外COM组件(即ActiveX EXE)始终由COM服务控制管理器启动,而不是由调用 CreateObject 的进程启动。这就是为什么ActiveX EXE的父进程是 svchost.exe 。
因此,调用 CreateObject 的进程与创建的进程之间没有直接的父子关系。实际上在两个进程之间来回传递方法调用的远程过程调用(RPC)层知道所涉及的进程的身份,但RPC机制专门设计为对COM子系统透明,并且没有轻松访问我所知道的这些信息。
但是,如果您愿意更改VB6应用程序,那么处理孤立进程问题有一种非常糟糕的方法:
让您的监视器服务定期终止运行Bartender EXE的所有(每天一次或者经常需要防止服务器减速太多)。
为Bartender功能编写一个包装器DLL,让你的VB6类使用这个包装器库,而不是直接实例化原始的Bartender对象。该库将包含一个包装类,该类创建一个Bartender对象,并且具有委托给该对象的方法。每个包装器方法应捕获错误462(“远程服务器机器不存在或不可用”),如果发生这种情况,则重新创建Bartender对象,然后重试该方法。
例如(我实际上没有看过Bartender的文档,所以这只是展示了这个想法):
'BartenderWrapper.cls
Private m_bartender As Object
Private Sub Class_Initialize()
Set m_bartender = CreateObject("Bartender.Application")
End Sub
Public Sub PrintLabel(Byval sLabelData As String)
On Error Goto ErrorHandler
m_bartender.PrintLabel sLabelData
Exit Sub
ErrorHandler:
If IsRpcError(Err) Then
Set m_bartender = CreateObject("Bartender.Application")
Resume
End If
Err.Raise Err.Number, Err.Source, Err.Description
End Sub
Private Function IsRpcError(Byval e As ErrObject) As Boolean
IsRpcError = (e.Number = 462)
End Function
这里的想法是,由于您无法可靠地确定哪个Bartender进程仍然连接到您的VB6应用程序的实例,您可以定期终止所有正在运行的Bartender进程,并且您的应用程序仍然能够正常运行(在大多数情况下),因为如果你杀死正在运行VB6应用程序实例的Bartender EXE,你的应用程序将创建一个新的Bartender实例并继续正常运行。
这个解决方案绝对不是万无一失的,如果您使用了很多方法,或者您创建的Bartender实例具有可能在创建新实例时丢失的重要内部状态,则可能难以实现。
当涉及到它时,如果你不控制所涉及的所有应用程序(做控制时的一个常见解决方案),就没有一种干净的方法来检测孤立的ActiveX EXE ActiveX EXE是让ActiveX EXE每隔一秒左右用 ByRef 参数引发一个事件,如果客户端没有改变参数的值,则让它自行关闭。) p>
答案 2 :(得分:0)
我们决定做的是让客户在每次客户创建调酒师时写一个提示文件。客户端将一个微小的XML文件写入一个公共文件夹中,该文件夹中的XML等效于“我是PID编号n。在时间x和时间y之间,我创建了一个调酒师”。时间x和y是在CreateObject调用之前和之后立即获得的时间戳。我们将提供监控新客户端,新Bartenders和提示文件的监控服务。通过观察所有这些,我们认为我们可以创建小组或客户及其相关调酒师的协会。在任何特定组中,当所有客户都离开时,该组中任何剩下的调酒师都会被杀死!