TMemoryStream、String与OleVariant互转
////////////////////////////////////////////////////////////////////////////////
//功能: 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互转的更多相关文章
- c++ string 与 char 互转 以及base64
c++ string 与 char 互转 很简单如下 ] = {'A','B','C','D','E'}; printf("%s\n",bts); //char to string ...
- string与wstring互转
string与wstring互转 C++ Code 123456789101112131415161718192021222324252627282930313233343536373839404 ...
- 下载STRING数据库检索互作关系结果为空,但是在STRING网站却能检索出互作关系,为什么呢???关键词用的是蛋白ID(ENSP开头)
首先介绍下两种方法: 一.本地分析 1.在STRING数据库下载人的互作文件,如下图,第一个文件 https://string-db.org/cgi/download.pl?sessionId=HGr ...
- Go语言网络通信---string与int互转,int64与[]byte互转,int直接互转,string与[]byte互转
string与int互转 #string到int int,err:=strconv.Atoi(string) #string到int64 int64, err := strconv.ParseInt( ...
- STRING Cytoscape 网络互作图
网络图(Network)看似复杂,其实构成非常简单,网络图是一种图解模型,形状如同网络,故称网络图,由节点(node)和连线(edge)两个因素组成的.其中 node 又分为 source node( ...
- String与InputStream互转的几种方法
[java] view plain copy /** * 利用BufferedReader实现Inputstream转换成String <功能详细描述> * * @param in * @ ...
- C++ string和wstring互转实现
[转载] http://www.cppblog.com/kenwell/archive/2008/05/21/50661.html 很好,很强大,用到就是赚到! 代码如下: #include < ...
- cocos2d-x类型转换(CCstring int string char UTF-8互转)
在做数据转换时,最好包含以下头文件 #include <iostream> #include <cmath> #include <string> #include ...
- python string与list互转
因为python的read和write方法的操作对象都是string.而操作二进制的时候会把string转换成list进行解析,解析后重新写入文件的时候,还得转换成string. >>&g ...
随机推荐
- 在CentOS/RHEL/Scientific Linux 6下安装 LAMP
LAMP 是服务器系统中开源软件的一个完美组合.它是 Linux .Apache HTTP 服务器.MySQL 数据库.PHP(或者 Perl.Python)的第一个字母的缩写代码.对于很多系统管理员 ...
- Python3.5.1 下使用HTMLParser报错
pip 安装HTMLParser之后,import HTMLParser 使用的时候,报错"ImportError:Can't not find module markupbase" ...
- 如何用 new 来动态开辟一个二维数组
一般的做法是: int **p = new int*[m]; //m行n列型 for (i = 0; i < m; ++i) { p[i] = new int[n]; for (j = 0; j ...
- vnc server配置、启动、重启与连接,图形管理linux系统
环境:RedHat Linux 5企业版.Xwindows:gnome (红帽默认安装的图形界面) 尽管我们可以使用SSH连接远程通过字符界面来操作Linux,但是对于更多熟悉图形人来说是很不方便的, ...
- HDU 4738 双连通模版题
九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11711577 题意:给定n个点,m条无向边 下面m行表示u , v ,边权值 求 ...
- iOS viewController添加导航条以及返回跳转选择
给单独的viewcontroller或者在Appdelegate的主页面添加导航条,只要在viewcontroller上添加navigationcontroller,在添加此navigationcon ...
- SRM 577 Div II Level Two: EllysRoomAssignmentsDiv2
题目来源: http://community.topcoder.com/tc?module=ProblemDetail&rd=15497&pm=12521 这个问题要注意的就是只需要直 ...
- c语言中scanf()、printf()函数
函数调用scanf(“%d”, &weight) 包含两个参数:“%d” 和&weight.C用逗号来隔开函数调用中的多个参数: 但是printf()和scanf()函数比较特殊,其 ...
- Intent数据传递
(1)首先是Activity的简单跳转: 1).Activity的切换一般是通过Intent来实现的,Intent是一个Activity到达另一个Activity的引路者,它描述了起点(当前Activ ...
- Qt容器类(总结)(新发现的QQueue和QStack,注意全都是泛型)
Introduction Qt库提供了一组基于模板的一般化的容器类.这些容器可以存储指定的类型的元素.例如,如果你需要一个可变大小的Qstring数组,可以用QVector<QString> ...