Delphi - TValue指针和背面

RBA*_*RBA 3 delphi delphi-10.1-berlin

我正在努力处理一段简单的代码,即使很简单,我找不到解决方案.在某个方面,我有一个像这样的事件

OnReadMessageParameter(Self, aName, aTypeInfo, pointer(@aValue), [psIsTValue]);
Run Code Online (Sandbox Code Playgroud)

重要的是aValue参数,它是TValue类型.当这被称为aValue.IsObject时为true.为了处理来自它的数据,我已经为此事件分配了我的例程:

.DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
  aTypeInfo: PTypeInfo; const DataRef: pointer; Attributes: TParamAttributes);
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是,我已经尝试过几种方法将DataRef转换回TValue项:

var val: tvalue;

tvalue.Make(@DataRef^,TypeInfo(TValue),val);
or another attempt
val := TValue(@DataRef^);
Run Code Online (Sandbox Code Playgroud)

但IsObject属性为false.它一定是非常简单的东西,我错过了.任何的想法?

Chr*_*ton 6

其中aValue是TValue,@ aValue是指向TValue结构的指针,而不是它包含的值.更好的设计是使OnReadMessageParameter事件将其DataRef参数键入TValue本身,而不是无类型指针.

但是,如果你无法控制它,你需要将DataRef转换为指向TValue的指针,然后遵循它 -

type
  PValue = ^TValue;
var
  val: TValue;
begin
  val := PValue(DataRef)^;
Run Code Online (Sandbox Code Playgroud)