本人接触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++写的客户端没有错误。
请教有经验的同学们。

解决方案 »

  1.   

    另外。奇怪的是。在JAVA脚本中。如果在出错语句之前写这样的语句
    var b = Node.CreateAttr("name", "value");
    错误就不见了。
    可是如果把var b =去掉,只写Node.CreateAttr("name", "value");
    还是会出错。郁闷。
      

  2.   

    使用pVal之前没有检查pVal是否非空
      

  3.   

    return S_FALSE;?
    这样写不好,这个只是告诉调用者这个函数是否出问题。
    比如java语言调用的话返回这样就会产生一个异常
      

  4.   

    呵呵。问题已经在转天凌晨解决。但是这两天忙没有结贴。
    原因是我在CreateAttr的时候使用了CoCreateInstance来创建Attr对象的实例。
    实际上应该使用
    CComObject<CAttr>* pT;
    HRESULT hr = CComObject<CAttr>::CreateInstance(&pT);
    pT->QueryInterface(... , ...);
    这样。还是感谢各们的帮助和建议。现在结贴。