首先,我想说明我需要使用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));
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 ++行)与我的包装程序(几百行)。
答案 0 :(得分:0)
CoMarshalInterface(以及相关的API)可用于将接口编组到网络上的另一个线程,进程或不同的PC上。我不知道在完成编组过程之前你可以等多久,但原则上,如果你正在编组接口的对象还没有关闭,那么编组过程可以在以后完成。
能够销毁一个OLE对象并稍后恢复“同一个对象”被绑定到所谓的Monikers,如果你(可以)理解那些,那么你的OLE / COM Juju确实很强大。
答案 1 :(得分:0)
如果应用程序在运行对象表中注册,则可以使用GetActiveObject函数获取对应用程序对象的引用。
IUnknown *pUnknown;
hr = GetActiveObject(clsid, NULL, &pUnknown);
assert(SUCCEEDED(hr));
hr = pUnknown->QueryInterface(IID_IDispatch, (void **)&(iePtr_));
assert(SUCCEEDED(hr));
答案 2 :(得分:0)
我建议使包装层长寿命而不是瞬态,因此它可以轻松地保存对第三个应用程序的单个引用。
对于客户端代码,包装器仍然可能是瞬态的。 如果你使包装器成为COM单例,那么每次你创建它时,你都会得到相同的实例。
要确保包装器在客户端的生命周期中存在,请保留从启动到关闭的引用。此引用不需要连接到其他代码。所有其他代码只是在每次需要时创建单例。
答案 3 :(得分:-1)
不,那是不可能的。 COM的整个想法是COM服务器是透明启动的,只保留状态,直到你停止使用它的对象。在释放COM对象后,COM子系统可以完全停止服务器,并且无法重新创建相同的进程。类似结果的唯一方法是使用一个带有序列化方法的COM对象,该方法允许将状态保存到流中并从流中恢复。但即使这样,你也必须再次使用CoCreateInstance(),获取一个新的COM对象接口指针并调用该对象的恢复方法。
从CoCreateInstance获取的指针仅对当前进程有效,如果将其保存在磁盘上并稍后恢复它将无效。