之前没有使用过安全数组,
这是对接一个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
这是对接一个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
解决方案 »
- delphi中自动生成的Tbutton组件的CAPTION能否显示二行?
- NMUDP控件能实现A-B B-C的数据包的转发吗?
- 欲转行JAVA的看过来~~~~~~~~~~~~~~~~~~~
- 怎么在程序初始化的时候定义一个全局的字符串数组?
- 如何修改各种应用程序的图标
- Tregistry的使用
- ADO+Access在运行sum()时速度很慢,有何方法提速?
- 请教两个问题??
- 连接远程数据库时怎样知道连接的ip?我查询过以前的帖子,不过没有找到符合的。
- 各位大哥指点一下,我现在使用DELPHI较多些,是否有必要花点时间研究一下VC?
- DELPHI 中位操作(bitwise)的问题
- 求依时利698CT下载补贴函数API
SafeArrayGetElement(目标数组,数组引索号,存读出的数数组)
p:PSafeArray,是安全数组
你好,我的朋友也是这样说,返回的值也应该是个数组,那我应该如何把这个数组转化我的消费记录的结构体呢?
SafeArrayGetElement(目标数组,数组引索号,存读出的数数组)
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;
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;