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那里下个断点,跟进去看看是哪里出的错

上代码:

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看看