看过《VC++技术内幕》中关于“自动化”的那章吧,有一个问题!
其实问题很简单,就是如何获得已经运行的自动化服务器的接口。
在第四个例子(自动化客户程序)中获得Excel接口的方法是:如果excel的Application对象存在就用AttachDispatch,否则直接CreateDispatch
程序如下:
void CEx24dView::OnExceloleLoad()
{ // if Excel is already running, attach to it, otherwise start it
LPDISPATCH pDisp;
LPUNKNOWN pUnk;
CLSID clsid;
TRACE("Entering CEx24dView::OnExcelLoad\n");
BeginWaitCursor();
::CLSIDFromProgID(L"Excel.Application.8", &clsid); // from registry
if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK) {
VERIFY(pUnk->QueryInterface(IID_IDispatch,
(void**) &pDisp) == S_OK);
m_app.AttachDispatch(pDisp);
pUnk->Release();
TRACE(" attach complete\n");
}
else {
if(!m_app.CreateDispatch("Excel.Application.8")) {
AfxMessageBox("Excel 97 program not found");
}
TRACE(" create complete\n");
}
EndWaitCursor();
}
本章第三个例子是个时钟的Server,在第四个例子(自动化客户程序)中直接CreateDispatch创建。我不想用那样的办法,想象上面这样先运行的时钟程序,然后再获得它的自动化接口,可是在::GetActiveObject()时失败!为什么会这样?是时钟程序的自动化接口的问题,还是其他的什么问题?如何解决?
LPUNKNOWN pUnk;
CLSID clsid;
::CLSIDFromProgID(L"Ex24c.Auto", &clsid); // from registry
if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK)
AfxMessageBox("GetActiveObject Ex24b.Auto succeed!");
else
AfxMessageBox("GetActiveObject Ex24b.Auto failed!");//老是这个提示!!!
不知我说明白了没有!