现在有一个COM接口
interface IData : IDispatch{
    HRESULT GetData(long param, [out, retval] IDataSet** pIDataSet);
}
其中第二个参数也是一个接口
interface IDataSet: IUnknown;
在vc2008中#import该dll得到方法,得到该
可是CoCreateInstance一个IData接口以后,调用
    IDataSet ds = IData->GetData(param);
返回的ds指针不为空,但是调用ds中的方法却总扔异常
后来发现IDataSet继承的不是IDispatch而是IUnknow,请问是不是与此有关?
应该如何解决这个问题呢?此外:这个COM组件在其他语言delphi和bcb中均正常工作。

解决方案 »

  1.   

     IDataSet ds = IData->GetData(param); 这种调用方式对吗?
    其他的应该没有异常
      

  2.   

    GetData调用方法不对,正确的调用方法:
    IData *pData = NULL;
    CoCreateInstance(CLSID_Data, NULL, CLSCTX_INPROC_SERVER, __uuidof(IData), (void**)&pData);
    IDataSet *pds = NULL;
    if (pData)
    {
        hr = IData->GetData(param, &pds); 
        if (hr == S_OK)
        {
            pds->...
        }
    }
      

  3.   

    GetData调用方法不对,正确的调用方法:
    IData *pData = NULL;
    CoCreateInstance(CLSID_Data, NULL, CLSCTX_INPROC_SERVER, __uuidof(IData), (void**)&pData);
    IDataSet *pds = NULL;
    if (pData)
    {
        hr = pData->GetData(param, &pds); 
        if (hr == S_OK)
        {
            pds->...
        }
    }
      

  4.   

    返回的接口不是必须为派生自IDispatch的,IDispatch只有对于那些不支持IUnknown的语言(如vb)才是必须的
    我觉得你调用ds的方法出现异常,不一定合它返回什么类型接口有关,而是你方法本身就有异常。尝试调试你那个IDataSet的api把
      

  5.   

    问题很奇怪
    vc #import生成的代码提供了一个类
    class IData
    {
      IDataSetPtr pIDataSet GetData(long param); 
    }
    该方法会直接返回一个DataSet指针。可是这个指针指向的内容总在返回前被释放掉了,因此总扔异常。
    而实际上这个GetData会调用
    HRESULT raw_GetData(long param, IDataSet** ppIDataSet);inline IDataSetPtr IData::GetData (long param) {
        struct IDataSet * _result = 0;
        HRESULT _hr = raw_GetData(param, &_result);
        if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return IDataSetPtr(_result, false);
    }raw_GetData传入一个指针的指针ppIDataSet,返回一个HRESULT
    我现在直接使用raw_GetData返回的指针就没有问题。 
    我猜测GetData调用raw_GetData后得到_result并增加了IDataSet的引用,但是这个_result并没有直接返回;而GetData调用IDataSetPtr(_result, false)利用_result复制构造一个指针。raw_GetData返回时,_result又减少了引用最终导致对象被释放。我想最终原因还是IUnknown导致的,可能是对IUnknow时,vc导出的代码没增加对象的引用计数。