Delphi OleVariant与 String 、TMemoryStream、Recordset 的相互转换
Delphi OleVariant与 String 、TMemoryStream、Recordset 的相互转换
1、OleVariant与 String
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //OLEVARIANT转STRING function OleDataToText( const AData: OleVariant): string ; var nSize: Integer ; pData: Pointer ; begin if AData = Null then Result := '' else begin nSize := VarArrayHighBound(AData, 1 ) - VarArrayLowBound(AData, 1 ) + 1 ; SetLength(Result, nSize); pData := VarArrayLock(AData); try Move(pData^, Pchar (Result)^, nSize); finally VarArrayUnlock(AData); end ; end ; end ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //string 与 OleVariant function TextToOleData( const AText: string ): OleVariant; var nSize: Integer ; pData: Pointer ; begin nSize := Length(AText); if nSize = 0 then Result := Null else begin Result := VarArrayCreate([ 0 , nSize - 1 ], varByte); pData := VarArrayLock(Result); try Move( Pchar (AText)^, pData^, nSize); finally VarArrayUnlock(Result); end ; end ; end ; |
2、OleVariant与 TMemoryStream
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | //OLEVariant转TMemoryStream: function MemoryStreamToOleVariant(Strm: TMemoryStream): OleVariant; var Data: PByteArray; begin Result := VarArrayCreate([ 0 , Strm . Size - 1 ], varByte); Data := VarArrayLock(Result); try Strm . Position := 0 ; Strm . ReadBuffer(Data^, Strm . Size); finally VarArrayUnlock(Result); end ; end ;<br> // function OleVariantToMemoryStream(OV: OleVariant): TMemoryStream; var Data: PByteArray; Size: integer ; begin Result := TMemoryStream . Create; try Size := VarArrayHighBound(OV, 1 ) - VarArrayLowBound(OV, 1 ) + 1 ; Data := VarArrayLock(OV); try Result . Position := 0 ; Result . WriteBuffer(Data^, Size); finally VarArrayUnlock(OV); end ; except Result . Free; Result := nil ; end ; end ; |
3、OleVariant与 Recordset
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | function RecordsetToVariant( const Recordset: _Recordset; var Stream: OleVariant): boolean ; var RS: OleVariant; vData: TMemoryStream; begin Result := false ; if Recordset = nil then Exit; vData := TMemoryStream . Create; try RS := CreateOleObject( 'ADODB.Recordset' ); RS := Recordset; RS . Save(TStreamAdapter . Create(vData) as IUnknown, adPersistADTG); vData . Position := 0 ; Result := true ; Stream := MemoryStreamToOleVariant(vData); except on E: Exception do begin RS := E . Message; Stream := RS; Result := False ; end ; end ; end ;<br> // function RecordsetFromVariant(vdata: OleVariant): _Recordset; var RS: OleVariant; Stream: TMemoryStream; begin Result := nil ; Stream := TMemoryStream . Create; Stream := OleVariantToMemoryStream(vdata); if Stream . Size < 1 then Exit; try Stream . Position := 0 ; RS := CreateOleObject( 'ADODB.Recordset' ); RS . Open(TStreamAdapter . Create(Stream) as IUnknown); Result := IUnknown(RS) as _Recordset; finally // end ; end ; |
创建时间:2021.02.05 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
分类:
Delphi C类型
标签:
Delphi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报