M$的XMLDOM

Tommy Chang 2000-06-07 03:09:00
在使用XMLDOM的时候,碰到一个问题

var
xmlCurChannel,xmlChannel : OleVariant;
i,j : Integer;
Begin
xmlChannel := CreateOleObject('Microsoft.XMLDOM');
xmlChannel.async := False;
bolReturn := xmlChannel.Load(somelocation);
For i := 0 To (xmlChannel.documentElement.childNodes.length - 1) do
Begin
xmlCurChannel := xmlChannel.documentElement.childNodes.Item(i);
//当调用item(i)的时候,出错,报“没有找到类对象“,经过测试,在Item(i)这级出问题的。
......

End;

而我在vb里面写了同样的测试代码也出现了同样的问题

xmlCurChannel = xmlChannel.documentElement.childNodes.Item(i)
出同样的错误
但是
Set xmlCurChannel = xmlChannel.documentElement.ChilNodes.Item(i)
就没事。虽然知道set在vb的含义是将对象赋给某个变量,但是delphi中还需要什么特别处理吗?


目前测试过几部机器,上面所说的情况都发生于ie5+win95/NT上面,而在win2000下面,delphi那段程序是没问题的,所以这个问题很迟才发现。按照正规idl的用法,在delphi里面的那段代码真得看不出有什么毛病。

在win2000系统里面,其中typelib中关于这个方法的定义如下
[id(00000000), propget, helpstring("collection of nodes")]
IXMLDOMNode* item([in] long index);
是节选自MSXML3.dll输出的。


很急,请各路高人指教。
...全文
179 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tommy Chang 2000-06-07
  • 打赏
  • 举报
回复
哈哈哈哈,让大家笑话了,这个问题原因非常初级,在delphi中这种类型应该是用[],而不是函数的形式。而在win2000中是因为typelib的函数“友好“一点,所以就....


对不起。
softdoctor 2000-06-07
  • 打赏
  • 举报
回复
该问题的确很麻烦!
item如果声明为方法就不会有问题了。
可偏偏是带参数的属性。

我想Delphi可能把它看成是方法了,调用时使用了
DISPATCH_METHOD而您的机器的COM库又不支持这样做。

如果使用COM IDispatch::Invoke 就能解决该问题。
使用起来很复杂。我这里简单的用C来描述一下,参照Delphi的文档应能写成相应PASCAL语句。

首先 获得dispid
我们这里 根据idl定义可直接设 dispid 为0
标准做法是GetIDsOfNames
hr = pdisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT,
&dispid);

在此帮定参数dispparams

DISPPARAMS dispparams;
为参数分配空间
dispparams.rgvarg = new VARIANT;
// 赋值
dispparams.rgvarg[0].vt = VT_I4;
dispparams.rgvarg[0].lval = 1;
dispparams.cArgs = 1;
dispparams.cNamedArgs = 0;

VARIANT vRet;
hr = pdisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &dispparams, &vRet, NULL,NULL);

// 清除内存
delete dispparams.rgvarg;

或许Delphi有解决此问题的对策,本人Delphi不是很熟。

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧