标签:
http://bbs.csdn.net/topics/380045353
用DelphiXE在WIN2008下编写一个访问WebServices的DLL ws.dll,只有一个输出函数,如下:
function Login(URL:PAnsiChar; UserName: PAnsiChar; UserPass: PAnsiChar; LocalLogin: Boolean):PAnsiChar; var tStr:String; begin try Result := PAnsiChar(GetLoginSoap(True,URL + WSDL_Login,nil).Login(UserName,UserPass,LocalLogin)); tStr := ‘成功‘; except tStr := ‘调用 Web 服务失败!‘; end; ShowMessage(tStr); end; 调用程序在XP下用DELPHI7编写, 采用静态连接: function Login(URL:PAnsiChar; UserName: PAnsiChar; UserPass: PAnsiChar; LocalLogin: Boolean):PAnsiChar;stdcall;external ‘ws.dll‘; 编译都通过,运行后,提示“调用 Web 服务失败!”,应该是执行WebServices调用失败了。 PAnsiChar(GetLoginSoap(True,URL + WSDL_Login,nil).Login(UserName,UserPass,LocalLogin)); 但是,在Win2008下用DelphiXE编写调用程序,提示“成功”。 将D7写的调用程序拷贝到WIN2008下执行,调用成功!!!! Dxe写的调用程序在XP和WIN2008下执行都成功。 我怀疑问题可能出在D7调用DLL时传递的PAnsiChar与DXE不兼容?将函数改成如下过程,避免传入传出参数 procedure Login1(); var tStr:String; begin try GetAuthenticationSoap(True,‘http://192.168.13.1/‘ + WSDL_Authentication,nil).Login(‘abc‘,‘abc‘,False); tStr := ‘成功‘; except tStr := ‘ER:调用 Web 服务失败!‘; end; ShowMessage(tStr); end; 结果,测试情况和之前一样, D7写的调用程序,在XP下调用失败,在WIN2008下调用成功。 DXE写的调用程序,在XP,WIN2008下都调用成功。 后来我又用C#写了一个调用程序,结果和DXE一样,在XP,WIN2008下都调用成功。 我滴个神啊! 我该怎么办? 通过procedure Login1();可以看出问题不是处在D7调用DXE写的DLL传参数问题。 应该是下面这句 GetAuthenticationSoap(True,‘http://192.168.13.1/‘ + WSDL_Authentication,nil).Login(‘abc‘,‘abc‘,False); 执行WebServices函数的语句出错了。 我再想,是不是DXE编写的调用WebServices程序需要什么其他的库支持。 可把DXE写的调用程序和WS.DLL拷贝到XP下,调用好使,说明不缺库。 可D7写的调用程序,为什么在XP下不好使,拷贝到WIN2008下就好使? 自己都说乱了。总结一下,问题现象是: D7 + WS.DLL 在XP下调用WebServices不成功,在WIN2008下成功 DXE+ WS.DLL 在XP和WIN2008下都成功 C# + WS.DLL 在XP和WIN2008下都成功 我现在就想要 D7+WS.DLL在XP下好使,怎么办? |
#1 得分:20回复于: 2011-11-12 15:53:46
dll中的函数没发现stdcall ,是笔误吗?
|
|
#2 得分:0回复于: 2011-11-12 15:59:51
我写的是函数实现,在定义处有。
|
|
#4 得分:0回复于: 2011-11-12 23:48:55
咋整的。没人呢? 提的不是地方?
|
|
#5 得分:40回复于: 2011-11-13 01:40:12
XE下是PAnsiChar
换成Delphi7下应该是Pchar |
|
#6 得分:40回复于: 2011-11-13 10:27:55
Result := PAnsiChar(GetLoginSoap(True,URL + WSDL_Login,nil).Login(UserName,UserPass,LocalLogin));
改成 Result := PAnsiChar(ansistring((GetLoginSoap(True,URL + WSDL_Login,nil).Login(UserName,UserPass,LocalLogin))); 试试 |
|
#7 得分:0回复于: 2011-11-13 15:39:21
谢谢两位的回复。
我觉得问题不是出在PChar 与 PAnsiChar上。 看我后来写的那个过程Login1(),不传入传出参数,调用WebServices还出同样的问题。 最令我气愤的是,一个DLL中的没有任何参数的函数,竟然被不同编译器编译的客户程序调用后,执行结果却不一样。 Delphi7写的调用客户端程序叫D7, DelphiXE写的调用客户端程序叫DXE, C#写的调用客户端程序叫C#, DLL文件叫DLL。 测试效果如下: D7 + DLL 在XP下调用函数成功,但是函数执行WebServices调用却失败,在WIN2008下一切正常 DXE + DLL 在XP,WIN2008下都正常 C# + DLL 在XP,WIN2008下都正常 奇了怪了。 |
|
#8 得分:0回复于: 2011-11-16 10:20:58
人气不旺盛啊。
|
|
#9 得分:0回复于: 2011-11-16 10:29:24
UnicodeString
WideString AnsiString String PChar PAnsiChar PWideChar PUnicodeChar ? |
|
#10 得分:0回复于: 2011-12-02 20:21:40
搞定,问题太简单了。失误啊。
原因是DLL中没有进行COM的初始化 initialization Coinitialize(nil);//初始化COM finalization CoUninitialize;//释放COM |
|
|
#11 得分:0回复于: 2012-11-24 01:23:06
加载什么地方
|
标签:
原文地址:http://www.cnblogs.com/westsoft/p/5921952.html