现在的位置: 首页 > 综合 > 正文

DLL为什么使用完毕后会提示:内存访问错误呢?

2012年03月15日 ⁄ 综合 ⁄ 共 1128字 ⁄ 字号 评论关闭
DLL为什么使用完毕后会提示:内存访问错误呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061215160532289.html
自己写了个DLL,用delphi调用我自己DELPHI写的DLL,运行结果可以出来,但运行完毕后会提示内存访问错误。我第二次调用的时候就直接提示内存访问错误,无法运行。在程序中我使用了Record集合作为返回记录  
  uses  
      sharemem,  
      。。。。。。  
  var    
      。。。。。。  
    type  
          Tps   =   Record  
                    sno:   integer;  
                    sname:string;  
                    skt:string;  
      End;  
      Tp=array   of   Tps;  
   
  我的函数是  
  function   sel(s:integer,var   PResult:Tp):integer;   export;   stdcall;  
  begin  
      s:=0;  
      ......  
      if   (满足条件)   then  
      begin  
          s:=s+1;  
          setlength(pResult,s);  
          PResult[s-1].sno:=某数据;  
          PResult[s-1].sname:=某数据;  
          PResult[s-1].stk:=某数据;  
      end;  
  end;  
   
  请兄弟们帮忙看看哪里有问题啊!  
 

把string类型换成shortstring

可能是其他代码的原因,用注释的方法或条件编绎逐块排除

我试了一下,就是换成PCHAR也还是不行的了,应该就是这段代码出的问题,因为没加这段代码前都是好好的,加了就有问题,我运行完毕后执行结果是有的,但会报内存错误。我第二次运行的时候居然连运行都不能运行就直接出错了。

1.没有string返回值,就不要用sharemem(sharemem有时会有问题,我也碰到过)  
  2.改string为string[250]   //如果数据长度不超过250的话  
    或改为char[1000];  
    不要改为pchar,因为它要申请内存  
   
 

用low   high函数来访问记录数组

我一般在访问Dll时都用pchar操作,只是多写几个参数罢了,可以避免很多问题的。

Tp=array   of   Tps;  
      PTp   =   ^TP;  
   
  function   sel(s:integer,var   PResult:PTp):integer;   export;   stdcall;  
   
  Tp改用指针

抱歉!评论已关闭.