代码之家  ›  专栏  ›  技术社区  ›  RBA

Delphi-指向指针和返回的值

  •  4
  • RBA  · 技术社区  · 7 年前

    我正在努力编写一段简单的代码,即使它很简单,我也找不到解决方案。在某种程度上,我有一个事件叫做这样

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

    TValue

    .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^);
    

    2 回复  |  直到 7 年前
        1
  •  6
  •   Chris Rolliston    7 年前

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

    然而,如果无法控制,则需要将DataRef转换为指向TValue的指针,然后遵从它-

    type
      PValue = ^TValue;
    var
      val: TValue;
    begin
      val := PValue(DataRef)^;
    
        2
  •  2
  •   Dave Olson    7 年前

    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);
    

    最后,如果