COM调用有关问题 ~ 纠结了很多天的有关问题
COM调用问题 高手进~ 纠结了很多天的问题
CoInitialize(NULL);
_Application app;
if(!app.CreateDispatch("Excel.Application", e))
{
e->ReportError(MB_OK);
return;
}
在有些机子成功,但在我机子一直失败 输出错误是“是没有注册类别”
但换成下面两句 就能成功开启Excel服务
CLSIDFromProgID(L"Excel.Application", &clsid);
CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
还请各位大侠指教
------解决方案--------------------
应该是注册信息被破坏了,内部链接的GUID不对。
------解决方案--------------------
app.CreateDispatch 内部也是调用的
CLSIDFromProgID(), CoCreateInstance()
你在app.CreateDispatch那里下个断点,跟进去看看是哪里出的错
上代码:
CoInitialize(NULL);
_Application app;
if(!app.CreateDispatch("Excel.Application", e))
{
e->ReportError(MB_OK);
return;
}
在有些机子成功,但在我机子一直失败 输出错误是“是没有注册类别”
但换成下面两句 就能成功开启Excel服务
CLSIDFromProgID(L"Excel.Application", &clsid);
CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
还请各位大侠指教
------解决方案--------------------
应该是注册信息被破坏了,内部链接的GUID不对。
------解决方案--------------------
app.CreateDispatch 内部也是调用的
CLSIDFromProgID(), CoCreateInstance()
你在app.CreateDispatch那里下个断点,跟进去看看是哪里出的错
上代码:
- C/C++ code
BOOL COleDispatchDriver::CreateDispatch(LPCTSTR lpszProgID, COleException* pError) { ASSERT(m_lpDispatch == NULL); // map prog id to CLSID CLSID clsid; SCODE sc = AfxGetClassIDFromString(lpszProgID, &clsid); if (FAILED(sc)) { if (pError != NULL) pError->m_sc = sc; return FALSE; } // create with CLSID return CreateDispatch(clsid, pError); } BOOL COleDispatchDriver::CreateDispatch(REFCLSID clsid, COleException* pError) { ASSERT(m_lpDispatch == NULL); m_bAutoRelease = TRUE; // good default is to auto-release // create an instance of the object LPUNKNOWN lpUnknown = NULL; SCODE sc = CoCreateInstance(clsid, NULL, CLSCTX_ALL | CLSCTX_REMOTE_SERVER, IID_IUnknown, (LPLP)&lpUnknown); if (sc == E_INVALIDARG) { // may not support CLSCTX_REMOTE_SERVER, so try without sc = CoCreateInstance(clsid, NULL, CLSCTX_ALL & ~CLSCTX_REMOTE_SERVER, IID_IUnknown, (LPLP)&lpUnknown); } if (FAILED(sc)) goto Failed; // make sure it is running sc = OleRun(lpUnknown); if (FAILED(sc)) goto Failed; // query for IDispatch interface m_lpDispatch = QUERYINTERFACE(lpUnknown, IDispatch); if (m_lpDispatch == NULL) goto Failed; ... HRESULT AFXAPI AfxGetClassIDFromString(LPCTSTR lpsz, LPCLSID lpClsID) { HRESULT hr; const CStringW strClsID(lpsz); if (lpsz[0] == '{') { hr = CLSIDFromString(const_cast<LPOLESTR>(strClsID.GetString()), lpClsID); } else { hr = CLSIDFromProgID(strClsID.GetString(), lpClsID); } return hr; }
------解决方案--------------------
直接传CLSID进去试试。。
------解决方案--------------------
重新regsvr32看看