//     TARec   --->   Variant
function RecordToVariant(value:TParamRecord):OleVariant;
var P:Pointer;
begin
  Result:=VarArrayCreate([0,sizeof(TParamRecord)],varByte);
  P:=VarArrayLock(Result);
  Move(value,P^,sizeof(P));
  VarArrayUnlock(Result);
end;

//   OleVariant   ---->   TARec
function VariantToRecord(value:OleVariant):TParamRecord;
var P:Pointer;
begin
  P:=VarArrayLock(value);
  Move(P^,Result,sizeof(TParamRecord));
  VarArrayUnlock(value);
end;

好像不好使。先留着。

以下不知道好使否,也先留着。

Variant --> Stream

var ov: OleVariant;
  ms: TStream; p: Pointer;
begin
  ov := dmMain.ComConnection.AppServer.TimeZone;
  ms := TMemoryStream.Create;
  ms.Position := 0;
  p := VarArrayLock(ov);
  ms.Write(p^, VarArrayHighBound(ov, 1)); //這句可否改進?
  VarArrayUnlock(ov);

ms.Position := 0;
  ...
  ms.Free;
end;

Stream --> Variant

function TTCanteenSvr.Get_TimeZone: OleVariant;
var
  AStream: TStream;
  MyBuffer: Pointer;
begin
  try
    AStream := TFileStream.Create(, fmOpenRead);
    Result := VarArrayCreate([0, AStream.Size - 1], VarByte);
    MyBuffer := VarArrayLock(Result);
    AStream.ReadBuffer(MyBuffer^, AStream.Size);
    VarArrayUnlock(Result);
  finally
    AStream.Free;
  end;

Record --> Stream

var r,r2:TStockInfo;p:Pointer;iRecSize,StringSize:Integer;
  pc:PChar;
  s:string;v:Variant;
  ms:TMemoryStream;
begin
//  TStockInfo=record
//    SecurityID:string[12];
//    CompanyID:string[12];
//    InternalID:string[12];
//  end;
  // 赋值Record
  r.SecurityID:='123';
  r.CompanyID:='456';
  r.InternalID:='789';
  iRecSize:=SizeOf(TStockInfo);
  StringSize:=SizeOf(string);
  GetMem(p,iRecSize);
  GetMem(pc,StringSize);
  ms:=TMemoryStream.Create;
  // Move测试
  Move(r,p^,iRecSize);  // 赋值到指针
  Move(p^,r2,iRecSize); // 赋值到验证Record
  ms.WriteBuffer(p,iRecSize);
  ms.SaveToFile(AppPath+'test.txt');
//  ShowMessage(r2.SecurityID+','+r2.CompanyID+','+r2.InternalID);
  // 移动指针
  // 这里需要转换指针类型,string->PChar Integer->PInteger Double->PDouble 等等
//  Inc(PChar(p),StringSize);   // 跳过SecurityID
  // 赋值CompanyID
//  Move(P^,pc,StringSize);
//  Move(P^,s,StringSize);
//  ShowMessage(StrPas(pc));
//  Dec(PChar(p),StringSize); // 回来
  FreeMem(p);               // 并且释放
  ms.Free;
end;

最新文章

  1. IOS单元测试,OCMock
  2. select框内容的编辑、修改、添加、删除操作
  3. ABAP文本编辑框操作
  4. .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
  5. jmeter通过BeanShell 脚本,实现对http请求参数的加密
  6. Simple Games Using SpriteKit
  7. 循序渐进之Spring AOP(1) - 原理
  8. 前后端分离djangorestframework——解决跨域请求
  9. Java hashCode() equals()总结
  10. docker容器与宿主交互数据
  11. Spark基础脚本入门实践1
  12. android关闭日志
  13. 20172302 《Java软件结构与数据结构》第六周学习总结
  14. 设置PhoenixOS进入图形界面
  15. UOJ.52.[UR #4]元旦激光炮(交互 思路)
  16. The Annoying Bug
  17. mysql 5.7.19 zip版本 windows安装步骤
  18. ubuntu 开热点
  19. 【DP】【单调队列】【NOI2005】瑰丽华尔兹
  20. apt-mirror 校验错误文件处理

热门文章

  1. 2018最新APP Android UI设计规范
  2. HanLP 配置与使用
  3. 论文阅读理解 - Stacked Hourglass Networks for Human Pose Estimation
  4. MyEclipse 优化:之占用CPU过高100%
  5. //生成四位数的验证码--->
  6. Bow and Arrow Rigging in Blender
  7. 【maven】maven查看项目依赖并解决依赖冲突的问题
  8. eclipse操作(备忘)
  9. Android命令行工具学习总结
  10. Percona Toolkit之pt-table-checksum学习