function XinKaiPuDll_GetPIDInfo(A_pInfo: PXinKaiPuDllPIDInfoArr;
  var A_sRstMsg: String): Boolean;
var
  iRst1,i,iCount: Integer;
  pInfo: PXinKaiPuDllPIDInfo;
begin
      Result := False;
  iRst1 := -1;
  New(pInfo);
  FillChar(pInfo^,SizeOf(pInfo^),#0);
  iRst1 := XinKaiPuDll_CapGetAllSFdetail(pInfo);
  if iRst1 > 0 then
  begin
    iCount := iRst1;
    SetLength(A_pInfo^,iCount);
    for i := 0 to iRst1 - 1 do
    begin
      A_pInfo^[i].PID := pInfo^.PID;
      StrCopy(A_pInfo^[i].PName,PChar(Trim(pInfo^.PName)));
      Inc(pInfo);
    end;
    Result := True;
  end
  else
  begin
    A_sRstMsg := XinKaiPuDll_ErrorMsg(iRst1);
  end;
  Dispose(pInfo);  //执行到这里,释放指针时报‘invalid pointer operation’end;

解决方案 »

  1.   

    ....
    iRst1 := XinKaiPuDll_CapGetAllSFdetail(pInfo);
    ....
    检查iRst1的值,若<1 ,到函数XinKaiPuDll_CapGetAllSFdetail中去跟。
      

  2.   

    由于你inc(pinfo);导致pinfo移位,所以报错
      

  3.   

    指针的值都变了,你还dispose啊。。
      

  4.   

    将pinfo赋值给另一个指针,然后用那个指针操作。永远记住:new()的指针不能直接操作!
      

  5.   

    pInfo, pSrcInfo: PXinKaiPuDllPIDInfo;
    ...
    New(pInfo);
    pSrcInfo:= pInfo;
    ...
    Dispose(pSrcInfo); 
      

  6.   

    最好还是:
    New(pInfo);
    pSrcInfo:= pInfo;
    下面全用pSrcInfo代替pInfo进行操作
    ...
    Dispose(pInfo); 
      

  7.   

    function XinKaiPuDll_GetPIDInfo(A_pInfo: PXinKaiPuDllPIDInfoArr;
      var A_sRstMsg: String): Boolean;
    var
      iRst1,i,iCount: Integer;
      pInfo,pSrcInfo: PXinKaiPuDllPIDInfo;
    begin
      Result := False;
      iRst1 := -1;
      New(pInfo);
      FillChar(pInfo^,SizeOf(pInfo^),#0);
      iRst1 := XinKaiPuDll_CapGetAllSFdetail(pInfo);
      if iRst1 > 0 then
      begin
        pSrcInfo:= pInfo;
        iCount := iRst1;
        SetLength(A_pInfo^,iCount);
        for i := 0 to iRst1 - 1 do
        begin
          A_pInfo^[i].PID := pSrcInfo^.PID;
          StrCopy(A_pInfo^[i].PName,PChar(Trim(pSrcInfo^.PName)));
          Inc(pSrcInfo);
        end;
        Result := True;
      end
      else
      begin
        A_sRstMsg := XinKaiPuDll_ErrorMsg(iRst1);
      end;
      Dispose(pInfo);
    end;这样写也不行。而且pSrcInfo不用释放吗?
      

  8.   

    SetLength(A_pInfo^,iCount);
    Inc(pSrcInfo);
    都感觉很不靠谱。
    指针操作?数组操作?
    需要谨慎!
    lz 试试先内部组织一个非指针的数据,然后再赋值出去。
    分成两步以后,错误就好调试了。
      

  9.   

    不要用Inc(pInfo); StrCopy可以用Move代替或者直接循环数组
      

  10.   

    咋改都不行啊。
    那我这样说吧。我把调用的函数说明贴出来。谁帮我分析下,写个代码,我看看行不。
    typedef struct UserSF
    {
    long id; //编号
    char dsc[32]; //文字描述
    }SFINFO;6.19. 获取客户身份信息
    long CapGetAllSFdetail(SFINFO *pINFO)
    6.19.1. 功能描述
    获取全部身份信息(身份编号、描述)
    6.19.2. 参数说明
    入口参数
     SFINFO *pINFO  指向客户身份信息结构的指针,参见结构的详细描述。如果为空指针则直接返回系统当前身份信息的总数量。
    出口参数
     >0 成功获取信息的数量,信息存放在pINFO中
     -1  调用WebService异常
     -2   调用WebService失败