CAEngine::MonitorProcess
ADE User Guide > ADE Server Class Reference > CAEngine
(ADE 4.3新特征)
CAEngine::MonitorProcess(long pid)
通过指定的进程ID在ADE实例当中设置一个监控线程用来探测进程的结束,如果指定进程ID先结束,那么将终止ADE进程。在ADE运行的计算机上该进程必须退出。
通过使用该函数,可以帮助保证ADE进程在你的代码异常终止时也能正常结束,例如在调试过程中你过早地停止代码运行,或者在你的程序奔溃时。
COM协议需要一个调用程序来释放其使用的每一个对象,进程外COM服务器一般情况下保持处于活动状态,直至最后的对象被释放。在ADE中,ADE将一般情况下保持处于活动状态,直至进程在该对象上调用IUnknown::Release()(标准的COM接口方法)。但是这时会出现一个问题,当调用的进程提前终止时,例如在调试过程中或者奔溃时被终止。当发生这种情况时,调用进程没有机会释放对象,因此ADE没有收到释放信号,将继续运行。(任何进程外COM服务器都是如此)。
在你开始一个进程外ADE实例后,立即通过调用该方法,为它提供你自己的程序进程ID,使ADE能够监视你的进程状态,并在它终止时探测。正常情况下,你的进程将释放最后的 CAEngine实例以便ADE将先结束。但是这不会发生,ADE.exe进程将在它探测到你的进程终止时自动终止其本身。
用法
在VB.NET语法中,你应该在获得 CAEngine后立刻条用,如下所示:
Dim ade As CAEngine = new CAEngine Dim pid As Long = System.Diagnostics.Process.GetCurrentProcess().Id ade.MonitorProcess(pid)
返回值
如果成功设置监控线程将返回ture,否则返回false。
ErrorCode、 ErrorText,和 OutputBuffer 属性提供关于未成功时错误本质的更多信息。可能的错误代码包括:
- 85 - CAEngine::MonitorProcess(pid) 无法打开指定的进程ID。
注意
你不能对一个进程取消监控。一旦监控线程被建立,它将一直存在直到ADE终止。
你可以使用不同的pid(进程名称)多次调用。当这样做时,ADE将监视所有指定进程,任何一个进程结束它都将结束。
你只能在ADE.exe运行的计算机上监视进程。如果你通过DCOM使用远程ADE.exe,这将不能工作。
被监视的进程没有必要调用是调用的进程。你所需要的是它的pid。
你的安全设置必须是:ADE.exe进程账户允许它通过同步许可获取指定进程句柄(详细信息请参考[OpenProcess])。没有该许可是不同寻常的,但并非不可能。
该方法在ADE 4.2 COM API中没有曝光,因此你必须等待ADE4.3的"正式"发布。然而,在4.2.3程序补丁里有一个后门,这样能够通过自动化API接口调用。因此,从4.2.3开始你可以这样做:
Dim adeObj As Object = ade ade.MonitorProcess(System.Diagnostics.Process.GetCurrentProcess().Id)
Enable comment auto-refresher