COM 中,Olevariant和String转换问题(100分)

  • 主题发起人 主题发起人 kenns2000
  • 开始时间 开始时间
K

kenns2000

Unregistered / Unconfirmed
GUEST, unregistred user!
现在写一个压缩/解压缩的COM,在调用的时候,发现参数有问题,如果是String类型的,可以运行正常,但如果是OleVariant,就会报错,
但是在COM中,只能用OleVariant,请问有什么方法,能将String和OleVariant进行互换吗?
 
以前用过这个:
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper 2004.06.29
//功能: 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;

////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper 2004.06.29
//功能: 由 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;
 
绝对不能用 bstr,因为 string -> widestring -> string 这个过程是“有损”的,原因是 delphi 的 string <-> widestring 利用系统的 codepage 进行转换,会过滤字符。
 
to LSUPER,:你说有损,能否给出测试案例?
Widestring(string) -> widestring -> string ,我这么搞还行?
 
看来是有点麻烦,只有想其它办法了。
 
后退
顶部