繁体   English   中英

重新连接到通过COM启动的进程

[英]Reconnect to Process Started Via COM

首先,我想指出,我需要使用COM / OLE2 API,这是底层的东西,可以在C Windows Console程序中放入的东西。 我不能使用MFC。 我不能使用.NET。

我的问题是:

给出以下代码:

 CLSID clsid; HRESULT hr; hr = CLSIDFromProgID(L"InternetExplorer.Application", &clsid); assert(SUCCEEDED(hr)); hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&(iePtr_)); assert(SUCCEEDED(hr)); 

有没有一种方法可以将一些信息写入磁盘,以便以后可以重新连接到IE的同一实例? 基本上可以将“ iePtr_”字符串化,以便以后通过其他过程重构吗?

谢谢。

----稍后添加------

我要解决的更广泛的问题是,我想启动一个AutoCAD应用程序,将一些数据加载到其中,然后使其运行以供客户端与之交互。 稍后,他将返回我的应用程序,我想重新连接到同一AutoCAD会话并向其提供更多数据。

现在,我完全意识到我可以将IDispatch指针保留在应用程序的内存中,并且能够继续与同一AutoCAD进程进行交互。 那是我的后备职位。

但是,我使用“包装器”程序来完成我的COM任务。 因此包装器是瞬时的。 我的主应用程序启动包装程序,然后包装程序进行通信,然后退出。 我只希望后续的包装器过程能够重新连接到相同的AutoCAD过程。

为什么要使用包装纸? 这是工作原因:我的主要应用程序是32位应用程序,但是我可以使用64位包装器并与64位AutoCAD进行通信。 我需要能够与64位AutoCAD通信,并且可能无法轻松移植我的主应用程序(500K +行C ++)和我的包装程序(几百行)。

CoMarshalInterface (和相关的API)可用于将接口送至网络上的另一个线程,进程或其他PC。 我不知道在完成封送处理之前允许您等待多长时间,但是原则上,如果您要封送处理接口的对象尚未关闭,则封送处理可以稍后完成。

能够销毁一个OLE对象并随后还原“同一对象”与所谓的Monikers息息相关,如果您(可以)理解那些对象,那么OLE / COM Juju确实是强大的。

如果应用程序在“运行对象表”中注册了自己,则可以使用GetActiveObject函数获取对应用程序对象的引用。

IUnknown *pUnknown;

hr = GetActiveObject(clsid, NULL, &pUnknown);
assert(SUCCEEDED(hr));

hr = pUnknown->QueryInterface(IID_IDispatch, (void **)&(iePtr_));
assert(SUCCEEDED(hr));

我建议使包装层的寿命更长而不是短暂,因此它可以轻松地保存对第三个应用程序的单个引用。

包装程序仍然可能对客户端代码而言是瞬态的。 如果使包装器成为COM单例,则每次共同创建包装器时,您将获得相同的实例。

为了确保包装器在客户端的生命周期中有效,请保留从启动到关闭的引用。 此参考不需要连接到其他代码。 所有其他代码每次都只需要创建一个单例。

不,那是不可能的。 COM的整个想法是COM服务器透明地启动,并且仅保留状态,直到您停止使用其对象为止。 释放COM对象之后,COM子系统可以自由地完全停止服务器,并且无法重新创建相同的进程。 类似结果唯一可行的方法是使COM对象具有序列化方法,该方法将允许将状态保存到流中并从流中还原它。 但是即使那样,您仍然必须再次CoCreateInstance(),获取一个新的COM对象接口指针并调用该对象的restore方法。

从CoCreateInstance获得的指针仅对当前进程有效,如果将其保存在磁盘上并在以后还原,则它将变为无效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM