c#写的WebService没问题,Delphi通过窗体调用WebService也没问题,现在需要写成DLL来调用WebSerice(因为要给别人用啊!)
DLL代码:
library sLogin;
uses
? SysUtils,ActiveX,
? Classes,
? shulibLogin in 'shulibLogin.pas';
Function shulib_Login(pers_no,password:String):integer;stdcall;
var
? i:integer;
begin
??coinitialize(nil);
?try
??? i:=GetshulibLoginSoap.CheckUserLogin(Trim(pers_no),Trim(password));
? except
??? i:=6;
? end;
? Result := i;
?CoUnInitialize();
end;
{$R *.res}
exports
??? shulib_Login;
begin
end.
GetshulibLoginSoap是WSDL Import自动产生的,另外不需要外加THTTPRIO控件。
自动产生的shulibLogin.pas需要修改两个地方
?try
?? //RIO.HTTPWebNode.UseUTF8InHeader:=True;中文参数
???Result := (RIO as shulibLoginSoap);
??? if UseWSDLthen
??? begin
?????RIO.WSDLLocation := Addr;
?????RIO.Service := defSvc;
?????RIO.Port := defPrt;
??? endelse
?????RIO.URL := Addr;
? finally
??? if (Result =nil) and (HTTPRIO = nil) then
?????RIO.Free;
? end;
end;
initialization
?InvRegistry.RegisterInterface(TypeInfo(shulibLoginSoap),'www.lib.shu.edu.cn','utf-8');
?InvRegistry.RegisterDefaultSOAPAction(TypeInfo(shulibLoginSoap),'www.lib.shu.edu.cn/CheckUserLogin');
?InvRegistry.RegisterInvokeOptions(TypeInfo(shulibLoginSoap),ioDocument);
1.RIO.HTTPWebNode.UseUTF8InHeader:=True;对于中文参数必须加上?
2.InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap),?ioDocument);?如果传入的参数不能被webservice识别时,多半是因为你没有加上这一句。
编译。。。