描述:
现在有一个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:
有用,收藏一下
解决方案2: GetData调用方法不对,正确的调用方法:
解决方案3:
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->...
}
}
GetData调用方法不对,正确的调用方法:
解决方案4:
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->...
}
}
IDataSet ds = IData->GetData(param); 这种调用方式对吗?
其他的应该没有异常
返回的接口不是必须为派生自IDispatch的,IDispatch只有对于那些不支持IUnknown的语言(如vb)才是必须的
我觉得你调用ds的方法出现异常,不一定合它返回什么类型接口有关,而是你方法本身就有异常。尝试调试你那个IDataSet的api把
您可能想查找下面的文章:
- ATL项目中怎样建立继承于IUnknown的没有任何实现的基接口?
- 关于IUNKNOWN的QueryInterface的实现问题
- IUnknown作参数时怎么传参?
- COM聚合时候对IUnknown有两个不同的实现
- 继承IUnknown的接口,为什么在VB对象浏览中还是能看到?
- IUnknown的Addref/release功能都类似,为什么还要用户去实现?
- 接口在对IUnknown的继承过程中为什么不使用虚继承?
- 请问怎么通过进程ID获得IUnknown接口?
- 怎样理解“IUnknow即没有数据也没有函数,我们仅仅继承了接口”?IUnknown不是有3个函数声明吗?
- 我做了一个ActiveX控件,在客户程序的函数中需要此控件的IUnknown做为参数,调用GetIDispatch()函数总出错,该怎么办?