本人接触COM不久。试着写一个XML的COM习题。其中实现两个COM对象。Attribute(A)和Node(N)。
Node对象中用一个IAttr**和NumOfAttr保存他所有的属性。Node实现一个方法返回指定位置的Attr。
[id(1001), helpstring("property Get Attribute")]
HRESULT GetAttr(UINT nPos, [out, retval] IAttr** pVal);STDMETHODIMP CNode::GetAttr(UINT nPos, /*[out, retval]*/ IXMLAttr **pVal)
{
*pVal = NULL; if(nPos>=0 && nPos<m_NumAttr)
{
((IUnknown*)m_pAttr[nPos])->AddRef();
*pVal = m_pAttr[nPos];
}
else
return S_FALSE; return S_OK;
}问题是在JAVA脚本中,var a= node.GetAttr(n);总是出错。可是用C++写的客户端没有错误。
请教有经验的同学们。
Node对象中用一个IAttr**和NumOfAttr保存他所有的属性。Node实现一个方法返回指定位置的Attr。
[id(1001), helpstring("property Get Attribute")]
HRESULT GetAttr(UINT nPos, [out, retval] IAttr** pVal);STDMETHODIMP CNode::GetAttr(UINT nPos, /*[out, retval]*/ IXMLAttr **pVal)
{
*pVal = NULL; if(nPos>=0 && nPos<m_NumAttr)
{
((IUnknown*)m_pAttr[nPos])->AddRef();
*pVal = m_pAttr[nPos];
}
else
return S_FALSE; return S_OK;
}问题是在JAVA脚本中,var a= node.GetAttr(n);总是出错。可是用C++写的客户端没有错误。
请教有经验的同学们。
var b = Node.CreateAttr("name", "value");
错误就不见了。
可是如果把var b =去掉,只写Node.CreateAttr("name", "value");
还是会出错。郁闷。
这样写不好,这个只是告诉调用者这个函数是否出问题。
比如java语言调用的话返回这样就会产生一个异常
原因是我在CreateAttr的时候使用了CoCreateInstance来创建Attr对象的实例。
实际上应该使用
CComObject<CAttr>* pT;
HRESULT hr = CComObject<CAttr>::CreateInstance(&pT);
pT->QueryInterface(... , ...);
这样。还是感谢各们的帮助和建议。现在结贴。