Delphi7调用DelphiXE编写的DLL问题

kim_fu 2011-11-12 03:51:12
用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下好使,怎么办?

...全文
627 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoyation 2012-11-24
  • 打赏
  • 举报
回复
加载什么地方呢
kim_fu 2011-12-02
  • 打赏
  • 举报
回复
搞定,问题太简单了。失误啊。

原因是DLL中没有进行COM的初始化

initialization
Coinitialize(nil);//初始化COM
finalization
CoUninitialize;//释放COM
OO_is_just_P 2011-11-16
  • 打赏
  • 举报
回复
UnicodeString
WideString
AnsiString
String
PChar
PAnsiChar
PWideChar
PUnicodeChar
?
kim_fu 2011-11-16
  • 打赏
  • 举报
回复
人气不旺盛啊。
cqs6616 2011-11-13
  • 打赏
  • 举报
回复
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)));
试试
kim_fu 2011-11-13
  • 打赏
  • 举报
回复
谢谢两位的回复。
我觉得问题不是出在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下都正常

奇了怪了。
Mit1208 2011-11-13
  • 打赏
  • 举报
回复
XE下是PAnsiChar
换成Delphi7下应该是Pchar
kim_fu 2011-11-12
  • 打赏
  • 举报
回复
咋整的。没人呢? 提的不是地方?
kim_fu 2011-11-12
  • 打赏
  • 举报
回复
我写的是函数实现,在定义处有。
日总是我哥 2011-11-12
  • 打赏
  • 举报
回复
dll中的函数没发现stdcall ,是笔误吗?

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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