之前沒有使用過安全陣列,
這是對接一個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-30
CardNo:0
SFType:5120
SFAmount:3.79442416006077E-321
CardBalance:6.21476085095821E-317
SFDate:1899-12-30
CardNo:0
SFType:5120
SFAmount:3.79442416006077E-321
CardBalance:6.21476085095821E-317
SFDate:1899-12-30
CardNo:0
SFType:5120
SFAmount:3.79442416006077E-321
CardBalance:6.21476085095821E-317
SFDate:1899-12-30
uj5u.com熱心網友回復:
SafeArrayGetElement(p, i, xfinfo); p是啥SafeArrayGetElement(目標陣列,陣列引索號,存讀出的數陣列)
uj5u.com熱心網友回復:
p:PSafeArray,是安全陣列
你好,我的朋友也是這樣說,回傳的值也應該是個陣列,那我應該如何把這個陣列轉化我的消費記錄的結構體呢?
SafeArrayGetElement(目標陣列,陣列引索號,存讀出的數陣列)
uj5u.com熱心網友回復:
試試
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;
uj5u.com熱心網友回復:
不知道你的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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130118.html
