关于delphi调用Web Service时传递参数的问题(100分)

  • 主题发起人 主题发起人 milanqiu
  • 开始时间 开始时间
M

milanqiu

Unregistered / Unconfirmed
GUEST, unregistred user!
我用c#.net编写了一个Web Service的函数,其声明为:
public string SaveNode(XmlNode AXMLNode)
采用SOAP协议,接收一个XmlNode类型的参数。
然后我想用delphi调用它,在new完Web Services Importer后,delphi自动生成如下的代码:
Service1Soap = interface(IInvokable)
['{D617354A-F79B-4AC8-AB46-E439856B1483}']
procedure SaveNode(var parameters: SaveNode);
stdcall;
end;

为什么delphi认为的参数会是这个样子的呢?我如何传递一个IXMLNode类型的变量传给这个函数当参数呢?
 
你最好去看一下李维的新书,delphi要调用.net下的web service要通过ms soap toolkit
 
装D6补丁
 
User_LoginResult = type WideString;
{ "http://tempuri.org/" }
Get_Operator_InfoResult = type WideString;
{ "http://tempuri.org/" }
Get_Organization_AreaResult = type WideString;
{ "http://tempuri.org/" }
// ************************************************************************ //
// Namespace : http://tempuri.org/
// soapAction: http://tempuri.org/%operationName%
// transport : http://schemas.xmlsoap.org/soap/http
// style :do
cument
// binding : CommonSoap
// service : Common
// port : CommonSoap
// URL : http://10.52.133.82:81/Service1.asmx
// ************************************************************************ //
CommonSoap = interface(IInvokable)
['{8A426263-ED42-FB04-0C2D-02012519B91E}']
function User_Login(const User_ID: WideString;
const PassWord: WideString): User_LoginResult;
stdcall;
function Add_Operator(const User_ID: WideString;
const Name: WideString;
const Department: Byte;
const Manager: Byte;
const Auth: Byte;
const Expire: WideString;
const Home: Integer;
const Id_Card: WideString;
const Stat: Byte;
const Creator: WideString
): WideString;
stdcall;
function Get_Operator_Info(const User_ID: WideString): Get_Operator_InfoResult;
stdcall;
function Change_PW(const User_ID: WideString;
const Old_PW: WideString;
const New_PW: WideString): WideString;
stdcall;
function Get_Organization_Area(const Home: Integer): Get_Organization_AreaResult;
stdcall;
function Add_Organization(const Name: WideString;
const Org_Type: Byte;
const Home: Integer;
const Area: Integer;
const Addr: WideString;
const Principal: WideString;
const MSISDN: WideString;
const Tel: WideString;
const Fax: WideString;
const Stat: Byte;
const Creator: WideString): WideString;
stdcall;
end;
在Delphi7下调用User_Login('dd', 'dd);得到:
s := <information xmlns=""><name>test</name><department>直销中心</department><manager>否</manager><authority>禁止</authority><home_county>新罗城区</home_county><result>登陆成功</result></information>
代码如下:
var
f: CommonSoap;
s: String;
XmlDoc: IXmlDocument;
begin
f := (HTTPRIO1 as CommonSoap);
s := f.User_Login(Edit1.Text, Edit2.Text);
//
XMLDoc := NewXMLDocument;
XMLDoc.Encoding := 'utf-8';
XmlDoc.XML.Add(s);
XmlDoc.Active := True;
end;
为什么执行到XmlDoc.Active := True的时候会报错呢?
 
在C#下的XmlNode是被声明成了WideString,那在Delphi下该如何使用结点片段?
 
我将它保存到文本文件里,然后通过再用TXmlDocument加载它,就可以进行解析了
例如返回的XmlNode值为:
<RESP>
<RESULT>OK</RESULT>
<INFO>
<MSISDN>13950808997</MSISDN>
<PW>8888</PW>
</INFO>
</RESP>
我将上面保存到XXX.xml文件里,文件内容如下:
<?xml version="1.0" encoding="gb2312"?>
<RESP>
<RESULT>OK</RESULT>
<INFO>
<MSISDN>13950808997</MSISDN>
<PW>8888</PW>
</INFO>
</RESP>
然后用TXmlDocument对象加载它就可以处理了,不过这种方法的效率不好,
如果大家有好的办法贴上来共享呀!
 
后退
顶部