////////////////////////////////////////////////////////////////////////////////
//功能: 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;

////////////////////////////////////////////////////////////////////////////////
//功能: 由 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;

//转换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;

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;

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;
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;

http://www.cnblogs.com/hnxxcxg/archive/2013/02/27/2934790.html

TMemoryStream、String与OleVariant互转的更多相关文章

  1. c++ string 与 char 互转 以及base64

    c++ string 与 char 互转 很简单如下 ] = {'A','B','C','D','E'}; printf("%s\n",bts); //char to string ...

  2. string与wstring互转

    string与wstring互转  C++ Code  123456789101112131415161718192021222324252627282930313233343536373839404 ...

  3. 下载STRING数据库检索互作关系结果为空,但是在STRING网站却能检索出互作关系,为什么呢???关键词用的是蛋白ID(ENSP开头)

    首先介绍下两种方法: 一.本地分析 1.在STRING数据库下载人的互作文件,如下图,第一个文件 https://string-db.org/cgi/download.pl?sessionId=HGr ...

  4. Go语言网络通信---string与int互转,int64与[]byte互转,int直接互转,string与[]byte互转

    string与int互转 #string到int int,err:=strconv.Atoi(string) #string到int64 int64, err := strconv.ParseInt( ...

  5. STRING Cytoscape 网络互作图

    网络图(Network)看似复杂,其实构成非常简单,网络图是一种图解模型,形状如同网络,故称网络图,由节点(node)和连线(edge)两个因素组成的.其中 node 又分为 source node( ...

  6. String与InputStream互转的几种方法

    [java] view plain copy /** * 利用BufferedReader实现Inputstream转换成String <功能详细描述> * * @param in * @ ...

  7. C++ string和wstring互转实现

    [转载] http://www.cppblog.com/kenwell/archive/2008/05/21/50661.html  很好,很强大,用到就是赚到! 代码如下: #include < ...

  8. cocos2d-x类型转换(CCstring int string char UTF-8互转)

    在做数据转换时,最好包含以下头文件 #include <iostream> #include <cmath> #include <string> #include  ...

  9. python string与list互转

    因为python的read和write方法的操作对象都是string.而操作二进制的时候会把string转换成list进行解析,解析后重新写入文件的时候,还得转换成string. >>&g ...

随机推荐

  1. FileDescriptor

    FileDescriptor 在java中的java.io包下面 public final class FileDescriptor { ... } 官方的解释: 文件描述符类的实例用作与基础机器有关 ...

  2. zk mysql 主从自动切换

    zookeeper测试: DBI 版本: /DBI-1.616# zjtest7-redis:/root/DBD-mysql-4.031# perl Makefile.PL Can't exec &q ...

  3. 怎样为ubuntu eclipse 添加 GBK字符集

    以前没有发现,最近把自己的代码靠到同学电脑上运行报错,发现是字符集的问题,一般来说 eclipse默认的是GBK编码,而ubuntu上默认是没有GBK编码的,所以ubuntu eclipse 上自然就 ...

  4. erlang 初体验

    近期測试了一下 erlang的坑... 如不出意外.... 大家第一眼看到这语法... 心里第一句一定是"我擦.这TM都是啥!!!!!" 没有变量!!! 没有结构体!!! 没有循环 ...

  5. ListBox控件

    主要介绍:自定义数据.绑定数据库数据 前台代码: <div> <asp:ListBox ID=" Width ="100px"> <asp: ...

  6. c#--foreach遍历的用法与split的用法

    一. foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素.      该循环 ...

  7. Web端的Tab控件在切换Tab时Load数据出错的处理

    我们在应用Web端的Tab控件时,不管是Jquery easyui的还是Ext的Tab控件都会遇到一个问题,在Tab1正在加载数据的时候我们切换到Tab2,再切换回来,Load数据的控件就会出错,出错 ...

  8. 快捷键accesskey

    <!DOCTYPE html> <html> <body> <a href="http://www.w3school.com.cn/html/&qu ...

  9. Qt学习之路(60): 创建shared library

    前段时间说了Qt一些类库的使用,今天来换一下口味,来看一下程序设计的问题.今天来说的是关于共享库 shared library. 如果你打开一些 Windows 应用程序的目录,你会发现有很多程序的 ...

  10. QList 和std::list的比较

    QList QList<T> 是一个Qt通用容器类.它存储一序列的值,并且提供基于索引的数据访问方法和快速的插入和删除操作. QList<T>, QLinkedList< ...