DLL调用很奇怪的问题,求教!

huwenfeng2001hf 2013-11-28 08:05:55
我一个项目中有读食堂用的售饭机,DELPHI中调用成功,而PowerBuilder 9.0中调用不成功,求教。情况如下:

delphi中申明如下:
function SetConnectInfo(IConnectType:Integer;InPort:Integer; ITcpAddress:string;InBaud:Integer):Boolean; stdcall;far external DllName name '_SetConnectInfo@16';
function GetName(nDevice:Byte;Name:PChar;Version:PChar):Boolean; stdcall;far external DllName name '_GetName@12';
delphi中调用如下:
Name,Version:PChar;
SetConnectInfo(0,3,'',38400);
GetName(StrToInt(edt25.Text),Name,Version);
调用成功
我在PB中申明如下:
Public Function boolean SetConnectInfo(int IConnectType,int InPort,string ITcpAddress,int InBaud) LIBRARY "ICXF.dll" ALIAS FOR "_SetConnectInfo@16"
Public Function boolean GetName(char nDevice,ref char Name[],ref char Version[]) LIBRARY "ICXF.dll" ALIAS FOR "_GetName@12"
GetName函数中的nDevice分别试了int、char,Name、Version分别试了 ref char[]、ref string都不行。
SetConnectInfo调用成功
GetName 的调用试了好多种方式都失败



SetConnectInfo(0,3,'',38400) 成功

char name[],Version[]
for i=1 to 30
name[i]=char(0)
version[i]=char(0)
next
//机号:1
aa='1'
if GetName('1',Name[],Version[]) then
messagebox("",Name)
else
messagebox("系统提示","GetRecord失败!")
end if



string name,Version
name=space(30)
version=space(30)
aa='1'
if GetName(1,Name,Version) then
messagebox("",Name)
else
messagebox("系统提示","GetRecord失败!")
end if
...全文
159 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
huwenfeng2001hf 2013-11-28
  • 打赏
  • 举报
回复
原来是delphi中的int与PB中的int最大值不一样的
xhz8000 2013-11-28
  • 打赏
  • 举报
回复
设备厂商说不是他们的问题,说DELPHI能调用。晕啊 这不能说明PB能调用! 是我写的动态库一般会给出别的语言的调用样例!
huwenfeng2001hf 2013-11-28
  • 打赏
  • 举报
回复
引用 5 楼 xhz8000 的回复:
动态库不是你编写的吗?? 是就自己调式一下! 不是就找开发商给说法!
设备厂商说不是他们的问题,说DELPHI能调用。晕啊
xhz8000 2013-11-28
  • 打赏
  • 举报
回复
动态库不是你编写的吗?? 是就自己调式一下! 不是就找开发商给说法!
huwenfeng2001hf 2013-11-28
  • 打赏
  • 举报
回复
引用 2 楼 xhz8000 的回复:
还有把错误提示贴出来! 也许错误就在你的动态库里面发生的!
没有任何提示的错误,返回值为false
huwenfeng2001hf 2013-11-28
  • 打赏
  • 举报
回复
引用 1 楼 xhz8000 的回复:
Public Function boolean GetName(char nDevice,ref char Name[],ref char Version[]) LIBRARY "ICXF.dll" ALIAS FOR "_GetName@12" 你说这里出错我就说这里吧! 如果是输出参数就是 ref string Name, ref string Version 就可以了。 调用是需要多少空间,看dll文档说明, PB分配空间就是 String Name = space(30) 我一直这么用,现在写的webService 接口也这么用没有任何问题!
我也按你说的试过了,声明如下: Public Function boolean GetName(int nDevice,ref string Name,ref string Version) LIBRARY "ICXF.dll" ALIAS FOR "_GetName@12" string name,Version name=space(30) version=space(30) if GetName(1,Name,Version) then messagebox("",Name) else messagebox("系统提示","GetRecord失败!") end if
xhz8000 2013-11-28
  • 打赏
  • 举报
回复
还有把错误提示贴出来! 也许错误就在你的动态库里面发生的!
xhz8000 2013-11-28
  • 打赏
  • 举报
回复
Public Function boolean GetName(char nDevice,ref char Name[],ref char Version[]) LIBRARY "ICXF.dll" ALIAS FOR "_GetName@12" 你说这里出错我就说这里吧! 如果是输出参数就是 ref string Name, ref string Version 就可以了。 调用是需要多少空间,看dll文档说明, PB分配空间就是 String Name = space(30) 我一直这么用,现在写的webService 接口也这么用没有任何问题!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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