Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1257444
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2009-04-08 09:22:44



 
  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



--------------------------
新闻:FriendFeed 正在踏进 twitter 的领域
导航:博客园首页  知识库  新闻  招聘  社区  小组  博问  网摘  找找看
阅读(1483) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~