如何将olevariant数据转换成String或PChar?(100分)

  • 主题发起人 主题发起人 青侠
  • 开始时间 开始时间

青侠

Unregistered / Unconfirmed
GUEST, unregistred user!
我用接收到Olevariant数据,在delphi显示的是与原来发送过来的数据不一样的,如输入
12345,以string显示为'㈱?5'这样的乱码来,如只发“1”则接收到的是“1”,
不知道oleVariant数据类型的格式是怎么样的?我用mircrosft的Winsock控件通讯形成的
 
先用VarIsStr判断一下你的variant类型是不是字符串,
如果是的话,
就用vartostr来转换。
 
先看不是不是olestring如果是,直接olestrtostr()
 
我在调试时自动显示的类型是variant array of byte的
 
参考这2个函数

function TCommClient.SendString(aStr: String; const aDestination: String; aTTL: Integer): Integer;
var
V : Variant;
P : Pointer;
L : Integer;
begin
Result := -1;
try
L := Length(aStr);
if L > 0 then
begin
V := VarArrayCreate([0, L-1], varByte);
P := VarArrayLock(V);
try
Move(aStr[1], P^, L);
finally
VarArrayUnlock(V);
end;

Assert(FServer <> nil);
if Active then Result := FServer.Send(V, aDestination, aTTL);
end;
except
on E: Exception do
begin
TLogFile.WriteLn('发送数据出错, 错误信息="%s"', [E.Message]);
end;
end;
end;

procedure TCommClient.DoOnData(aData: OleVariant; const aSource: WideString; out aAction: Integer);
var
S : TMemoryStream;
P : Pointer;
L : Integer;
begin
if Assigned(FOnData) then
try
S := TMemoryStream.Create;
try
//将传过来的安全数组转换为TStream类型,触发事件
L := VarArrayHighBound(aData, 1) - VarArrayLowBound(aData, 1) + 1;
P := VarArrayLock(aData);
try
S.Seek(0, soFromBeginning);
S.WriteBuffer(P^, L);
finally
VarArrayUnlock(aData);
end;

FOnData (Self, S, aSource, aAction);
finally
S.Free
end;
except
on E: Exception do
begin
TLogFile.WriteLn('数据接收处理出错, 错误信息="%s"', [E.Message]);
end;
end;
end;
 
唉!定义一个结构不就...

_send=record
_sstr:string[255];
end;

var
_s:_send;
begin
_s._sstr:='12345';
socket1.send(_s,sizeof(_send));
end;


接受:
socket1.read(_s,ricevelength);
showmessage('Get: '+_s._sstr);
 
多人接受答案了。
 
后退
顶部