小弟初学COM,碰到如下问题。
         HRESULT hr;
::CoInitialize(NULL);
CXLogItemBase *test = new CXLogItemBase();

if(FAILED(hr))
{
cout << "Com Initialize failed";
}
Imath *pm;
IXSession *p;
hr = CoCreateInstance(CLSID_XSession, NULL, CLSCTX_LOCAL_SERVER, IID_IXSession, (void**)&p); if(FAILED(hr))
{
cout.setf(ios::hex, ios::basefield);
cout << "Failed to create server instance. hr = " << hr << endl;
return -1;
}
cout << "Instance created" << endl; hr = p->WriteLog((IXLogItemBase *)test);
//hr返回的是c0000005,访问异常,
这是输出信息:ClientTest.exe 中的 0x769c4379 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突CXLogItemBase 继承 IXLogItemBaseWriteLog的定义为
[helpstring("Method WriteLog")]
HRESULT WriteLog([in] IXLogItemBase *msg);请问这是什么原因啊

解决方案 »

  1.   

    是不是你的test要进行初始化什么的啊?
      

  2.   

    test指针是有合法地址的
    如果这么调用
    hr = p->WriteLog(NULL);
    就调用成功了 
      

  3.   


    那应该是IXSession内部调用IXLogItemBase接口出错。贴些你的IXLogItemBase接口看看。
      

  4.   

    inline HRESULT IXSession::WriteLog ( IXLogItemBase * msg ) {
        HRESULT _hr = raw_WriteLog(msg);
        if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return _hr;
    }
    就是调用raw_WriteLog出现了问题
    再想跟进去,就跟不进去了,这个函数应该是ATL自动生成的吧interface IXLogItemBase : IUnknown
    {
    [helpstring("Method GetFirstField")]
    HRESULT GetFirstField([out, string] BSTR *key, [out, string] BSTR *value) ;
    [helpstring("Method GetNextField")]
    HRESULT GetNextField([out, string] BSTR *key, [out, string] BSTR *value);
    };
    这是接口定义
      

  5.   

    贴下你的CXLogItemBase中GetFirstField和GetNextField的实现。
      

  6.   

    STDMETHODIMP CXLogItemBase::GetNextField(BSTR *key, BSTR *value)
    {
    return S_OK;
    }STDMETHODIMP CXLogItemBase::GetFirstField(BSTR *key, BSTR *value)
    {
    return S_OK;
    }
      

  7.   

    STDMETHODIMP CXLogItemBase::GetNextField(BSTR *key, BSTR *value)
    {
        return E_NOTIMPL;
    }STDMETHODIMP CXLogItemBase::GetFirstField(BSTR *key, BSTR *value)
    {
        return E_NOTIMPL;
    }
      

  8.   

    IXLogItemBase接口,我是想让他作为一个引出接口,也就是在客户端去实现的
    我不想使用链接点去做。
    请问我在MFC程序中添加这个接口的实现应该怎么做谢谢