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

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2009-02-19 17:03:24



library   MYDLL;  
   
  uses  
      sharemem,  
      SysUtils,  
      StdCtrls;  
  var  
      fjmain   :   TADODataSet;  
   
      type  
          Tps   =   Record  
                    sno:   integer;    
                    fjcode:pchar;  
                    fjname:pchar;//  
      End;  
      Tp=array   of   Tps;  
   
  {$R   *.RES}  
   
  function   Select(transmode:pchar;var   PResult:Tp):integer;   export;   stdcall;  
  var  
      fjcode,t1,t2:pchar   ;  
        totalnum:integer;  
  begin  
      fjmain:=   TADODataSet.Create(nil);  
      ADO配置过程......(OK的)  
      fjmain.Connection   :=   ADOConnection;  
      try  
          fjmain.Close;  
          fjmain.CommandText:=   'Select   *   From   fjmain   order   by   fjid';  
          fjmain.Open;  
          t1:=pchar(fjMain.fieldbyname('fjcode').asstring);      
          t2:=pchar(fjMain.fieldbyname('fjname').asstring);            
          while   not   fjmain.eof   do  
          begin  
              if   (满足条件)   then  
              begin  
                  totalnum:=totalnum+1;  
                  setlength(PResult,totalNum);  
                  PResult[totalNum-1].sno:=totalnum;  
                  PResult[totalNum-1].fjcode:=t1;  
                  PResult[totalNum-1].fjname:=t2;  
              end;  
              fjmain.next;  
          end;  
          Result   :=   totalnum;  
      finally  
          fjmain.Free;  
          CoUnInitialize;  
      end;    
  end;  
   
  exports  
      Select;  
   
  begin  
   
  end.  
   
  以上是我的代码,现在的问题是  
  第一:我在fjmain表循环的时候,有很多满足条件的记录,我看了结果仅仅最后一条记录中的fjcode,fjname字符串是正确的,其他的都是乱78糟的字符,或者是字符的前几个字母后面的字母是乱码,为什么呢?  
  第二:当我连续两次调用该DLL的时候,会出现内存错误,难道我什么地方没有释放字符串PCHAR变量,就是t1,t2变量么?  
   
  这个问题我已经搞了一个上午了,反复的换pchar,string来试,结果还是有内存问题,大家帮我看看程序的什么地方有问题呢?

totalnum的初始数值是多少

应该不是这个问题,初始值是0   啊

array   of   是Delphi特有的开放数组  
  作为DLL的接口,恐怕有问题的

直接使用fieldbyname().value试试?

totalnum的初始数值?

初始值我说了是0啊,我前面有这样语句的,我的问题还是在于STRING使用上的问题,因为我一旦去掉                 setlength(PResult,totalNum);  
                  PResult[totalNum-1].sno:=totalnum;  
                  PResult[totalNum-1].fjcode:=t1;  
                  PResult[totalNum-1].fjname:=t2;这几句,怎么运行都不会出问题的。

1、totalnum的初始值?  
  2、t1,t2是PChar类型,Pchar是指针,不能用来保存数据,当fjmain.Next后,应该指向了无效地址空间。  
  3、array   of   是Delphi特有的开放数组,作为DLL的接口,肯定有问题的。  
  4、在循环中反复使用setlength(PResult,totalNum);分配内存空间,可能造成前面已经赋值的记录数据丢失,造成乱码

谢谢以上各位兄弟们的关心和回答,尽管我问题还没有完全处理掉,但给我了很好的思路,先结帖,顺便关于下面的这个问题,问下大哥:  
  3、array   of   是Delphi特有的开放数组,作为DLL的接口,肯定有问题的。  
  (我ARRAY   OF只在函数中单独定义单独使用,不作为DLL程序和外界程序的接口,可以使用么?)  
 

我ARRAY   OF只在函数中单独定义单独使用,不作为DLL程序和外界程序的接口,可以使用么?  
  ===================================================================================  
  那应该没问题的,另外需要指出的是,输出记录地址最好由程序调用Dll函数前分配,不要在Dll中分配



--------------------------
新闻:专注、极致、快、口碑 互联网创业的葵花宝典
导航:博客园首页  知识库  新闻  招聘  社区  小组  博问  网摘  找找看
阅读(826) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~