Delphi - 指向指针和返回的 TValue

Delphi - TValue to pointer and back

我正在为一段简单的代码苦苦挣扎,即使很简单,我也找不到解决方案。一方面,我有一个这样的活动

OnReadMessageParameter(Self, aName, aTypeInfo, pointer(@aValue), [psIsTValue]);

重要的是 TValue 类型的值参数。调用时 aValue.IsObject 为真。我已将我的例程分配给此事件以处理来自它的数据:

.DoOnReadMessageParameter(Sender: TROMessage; const aName: string;
  aTypeInfo: PTypeInfo; const DataRef: pointer; Attributes: TParamAttributes);

现在,我的问题是,我尝试了多种方法将 DataRef 转换回 TValue 项:

var val: tvalue;

tvalue.Make(@DataRef^,TypeInfo(TValue),val);
or another attempt
val := TValue(@DataRef^);

但是 IsObject 属性 是错误的。它一定是非常简单的东西,我错过了。有什么想法吗?

其中aValue 是一个TValue,@aValue 是指向TValue 结构的指针,而不是它包装的值。更好的设计是让 OnReadMessageParameter 事件将其 DataRef 参数类型化为 TValue 本身,而不是非类型化指针。

但是,如果您无法控制它,则需要将 DataRef 转换为指向 TValue 的指针,然后引用它 -

type
  PValue = ^TValue;
var
  val: TValue;
begin
  val := PValue(DataRef)^;

如果您无法控制 DoOnReadMessageParameter 但您知道 DataRef 将始终是指向 TValue 的指针,那么:

type
   PValue = ^TValue;

procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string; 
       aTypeInfo: PTypeInfo; const DataRef : pointer; Attributes: TParamAttributes);

var
   HaveObject : boolean;

begin
   HaveObject := PValue(DataRef).IsObject;
   //...
end;

假设您控制了 DoOnReadMessageParameter 而不是事件 OnReadMessageParameter:

type
   PValue = ^TValue;

procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string; 
       aTypeInfo: PTypeInfo; const DataRef : PValue; Attributes: TParamAttributes);

var
   HaveObject : boolean;

begin
   HaveObject := DataRef.IsObject;
   //...
end;

如果您同时控制了两者:

OnReadMessageParameter(Self, aName, aTypeInfo, aValue, [psIsTValue]);

procedure [someclass].DoOnReadMessageParameter(Sender: TROMessage; const aName: string; 
       aTypeInfo: PTypeInfo; const DataRef : TValue; Attributes: TParamAttributes);

最后,如果 DataRef 可能指向任何东西,那你就倒霉了,因为你没有用于创建 TValue 实例的类型信息。