之前没有使用过安全数组,
这是对接一个VB做的Com接口,内存块已经取到//现在遍历出每个元素的结构体,可是怎么读也不对,还望各位指点一点,没有过这方面的经验
  PosLogInfo = packed record
    ReadMark: Byte;
    CardNo: Double;
    SFType: Smallint;
    SFMealTypeID: Smallint;
    SFAmount: Double;
    CardBalance: Double;
    SFDate: TDateTime;
    CardUseTimes: Integer;
    SFOpterNo: Smallint;
    OrderDate: TDateTime;
    ProductID: array[0..9] of Integer;
    ProductNum: array[0..9] of Integer;
  end;  function SafeArrayToText(p:PSafeArray): string;
  var    RBound: TVarArrayBound;
    i, UCount: Integer;
    xfinfo: PosLogInfo;//消费记录的结构体  begin    VarResultCheck((SafeArrayGetLBound(p, 1, RBound.LowBound)));
    VarResultCheck(SafeArrayGetUBound(p, 1, UCount));
    RBound.ElementCount := UCount - RBound.LowBound;//元素的个数,没有错,符合接口提示的22个.//现在遍历出每个元素的结构体,可是怎么读也不对,还望各位指点一点,没有过这方面的经验
    for i := RBound.LowBound to RBound.ElementCount do
    begin
      FillChar(xfinfo,SizeOf(xfinfo),0);
//这句不知道要如何写,按理是对的,可是不知道怎么回事,读出的值总是不对,而且每条竟然都是一样的
        VarResultCheck(SafeArrayGetElement(p, i, xfinfo));      Memo1.Lines.Add('CardNo:'+FloatToStr(xfinfo.CardNo));
      Memo1.Lines.Add('SFType:'+FloatToStr(xfinfo.SFType));
      Memo1.Lines.Add('SFAmount:'+FloatToStr(xfinfo.SFAmount));
      Memo1.Lines.Add('CardBalance:'+FloatToStr(xfinfo.CardBalance));
      Memo1.Lines.Add('SFDate:'+formatdatetime('',xfinfo.SFDate));    end;
  end;
//FillChar已经清0了结构体,遍历的值竟然全是一样的,说明应该已经有赋值了,而且还不对CardNo:0
SFType:5120
SFAmount:3.79442416006077E-321
CardBalance:6.21476085095821E-317
SFDate:1899-12-30CardNo:0
SFType:5120
SFAmount:3.79442416006077E-321
CardBalance:6.21476085095821E-317
SFDate:1899-12-30CardNo:0
SFType:5120
SFAmount:3.79442416006077E-321
CardBalance:6.21476085095821E-317
SFDate:1899-12-30CardNo:0
SFType:5120
SFAmount:3.79442416006077E-321
CardBalance:6.21476085095821E-317
SFDate:1899-12-30

解决方案 »

  1.   

    SafeArrayGetElement(p, i, xfinfo); p是啥
    SafeArrayGetElement(目标数组,数组引索号,存读出的数数组)
      

  2.   


    p:PSafeArray,是安全数组
    你好,我的朋友也是这样说,返回的值也应该是个数组,那我应该如何把这个数组转化我的消费记录的结构体呢?
    SafeArrayGetElement(目标数组,数组引索号,存读出的数数组) 
      

  3.   

    试试var
      RBound: TVarArrayBound;
      i, UCount: Integer;
      xfinfoArr: array of PosLogInfo;
    begin
      VarResultCheck((SafeArrayGetLBound(p, 1, RBound.LowBound)));
      VarResultCheck(SafeArrayGetUBound(p, 1, UCount));
      RBound.ElementCount := UCount - RBound.LowBound;  SetLength(xfinfoArr, SizeOf(PosLogInfo) * 22);
      for i := RBound.LowBound to RBound.ElementCount do
      begin
        //    FillChar(xfinfo, SizeOf(xfinfo), 0);
        VarResultCheck(SafeArrayGetElement(p, i, xfinfoArr));    Memo1.Lines.Add('CardNo:' + FloatToStr(xfinfoArr[i].CardNo));
        Memo1.Lines.Add('SFType:' + FloatToStr(xfinfoArr[i].SFType));
        Memo1.Lines.Add('SFAmount:' + FloatToStr(xfinfoArr[i].SFAmount));
        Memo1.Lines.Add('CardBalance:' + FloatToStr(xfinfoArr[i].CardBalance));
        Memo1.Lines.Add('SFDate:' + formatdatetime('', xfinfoArr[i].SFDate));
      end;
    end;
      

  4.   

    不知道你的safearray里是怎么存储的,这有个例子,数组里存的是2进制数据,把它取出来的代码:
    class procedure Convert.SafeArrayToBytes(const AData: OleVariant;
      var ABytes: TBytes);
    var
      sa : PSafeArray;
      l, u : Integer;
      p : Pointer;
    begin
      SetLength(ABytes, 0);
      if (TVarData(AData).VType = VT_ARRAY or VT_UI1) then
      begin
        sa  :=  TVarData(AData).VAny;    if S_OK <> SafeArrayGetLBound(sa, 1, l) then Exit;
        if S_OK <> SafeArrayGetUBound(sa, 1, u) then Exit;
        if (u = 0) then
          Exit;
        if S_OK = SafeArrayAccessData(sa, p) then
        try
          SetLength(ABytes, u - l + 1);
          CopyMemory(@ABytes[0], p, u - l + 1);
        finally
          SafeArrayUnaccessData(sa);
        end;
      end;
    end;