http://www.delphi2007.net/DelphiAPI/html/delphi_20061110115522258.html
PB的主程序调用DELPHI的DLL,DLL在函数执行完后回传一个字符串给PB主程序,DLL里用的是PCHAR类型。。PB下该怎么接收?
int RC,SectorID=15,i=1
char ReadStr[64]
int li_data[64]
char ls_data[64]
string data=''
Rc = M1QueryCard(15,ref ReadStr)
do while i<=64
li_data[i]=asc(ReadStr[i])
ls_data[i]=get_hex(li_data[i])
i++
loop
//ReadStr=get_hex_str(ReadStr)
messagebox('FOXHIS',ls_data)
以上是PB的程序。。。 M1QueryCard(15,ref ReadStr) 这个是我DELPHI写的DLL里的函数。。ReadStr 是DLL以PCHAR类型回传的一个字符串
现在这样不能用,读不到数据。。哪位知道是什么问题么
把你的delphi的dll函数类型,及相关代码也贴一下,否则怎么看得出来呢?
DELPHI的DLL代码:
var
ReadCardDataHex: string; //全局变量
Function M1QueryCard(SectorID:Shortint;var CardDatas:PChar):integer; stdcall; //查询卡
var
....
HexData1,HexData2: string;
begin
.....
for i:=0 to 15 do
begin
HexData2:= HexData2+IntToHex(CardData2[i],2);
end;
end;
ReadCardDataHex := HexData1+HexData2;
CardDatas:=Pchar(ReadCardDataHex);
result:=0;
end;
我DELPHI程序这样调用正常:
Function M1QueryCard(SectorID:Shortint;var CardDatas:PChar):integer;stdcall;external M1Dll;
pb调用delphi中dll,这种不同开发工具之间调试问题;
可以这样做,用delphi写一个小小的测试程序,用于测试dll,确保dll功能正确后,再由PB调用测试;
注意PB中的External Functions中,定义的dll输出类型要正确,一般来说,应该没有什么太大的问题的。
哦,这么快就贴出来了,
我觉得问题在这里:
CardDatas:=Pchar(ReadCardDataHex);//ReadCardDataHex是一个String类,这仅仅是指针指向而已,
改成这样试试:
StrCopy(CardDatas,ReadCardDataHex);
StrCopy(CardDatas,pchar(ReadCardDataHex));
要这样才能编译。。这样也不行,程序死掉了。DLL里的代码还没执行完就提示 XX错误,问要不要发送了。。
你的M1QueryCard在PB中是怎么声明的呀?
Function int M1QueryCard(int SectorID,ref string CardDatas) library 'm1.dll';
以前是这样定义的,不能用。不知道对方现在有没改动过
我不记得PB中的string是什么特别的类型了,改为
在delphi中Pchar,就是cha指针,而你上面的PB代码:char ReadStr[64];
定义改为这样试试:
Function int M1QueryCard(int SectorID,ref char* CardDatas) library 'm1.dll';
呵呵,我也不确定是否行,有几年没有用PB了,忘记了
另外,你的delphi测试代码是怎么调用的呢?
如果dll的第二个参数不用var,会怎么样,这样试试:
Function M1QueryCard(SectorID:Shortint;CardDatas:PChar):integer; stdcall; //查询卡
...
不用VAR会得不到回传的值。
DELPHI调用时声明为:
Function M1QueryCard(SectorID:Shortint;var CardDatas:PChar):integer;stdcall;external 'm1.dll';
唉。郁闷。。现在搞不定。。用简单的方法用着。。我把读出的数据保存为文本文件,对方打开文件读进来处理。。
这样定义:
Function M1QueryCard(SectorID:Shortint;CardDatas:PChar):integer; stdcall;
delphi中,pchar类型,不用var也是可以返回数据的,
var
cc:Array [0..256] of char
ii:shortint;
begin
M1QueryCard(i,cc);
showmessage(cc);//这样是可以返回数据的吧
这样试试:
delphi的dll中:
Function M1QueryCard(SectorID:Shortint;CardDatas:PChar):integer; stdcall;
PB声明:
Function int M1QueryCard(int SectorID,ref string CardDatas) library 'm1.dll';
如果这样都不行,呵呵,也想不什么问题了,我的机子上的PB早就删除了
噢。郁闷。。这样没试过。我的DELPHI程序调用是没问题的。现在就是PB有问题。。
下午跟对方说好了。。我保存成文件,他来读。。现在靠这样传数据。。汗。。真郁闷
PB程序可以这样写:
int RC,SectorID=15,i=1
string ReadStr
int li_data[64]
char ls_data[64]
string data=''
readstr = spaces(64)
Rc = M1QueryCard(15,ReadStr)
PB声明:
function M1QueryCard(integer len,ref string ReadStr) ......
Delphi程序这样写试试:
Function M1QueryCard(SectorID:integer;CardDatas:PChar):integer; stdcall;
shortint PB不支持。
用 FastMM