簡體   English   中英

無效的類型轉換:在64位平台上將記錄轉換為tobject

[英]Invalid typecast: convert record to tobject on 64-bit platform

它適用於32位平台。但這里不是64位的例子

  TVerbInfo = packed record
    Verb: Smallint;
    Flags: Word;
  end;

var
  VerbInfo: TVerbInfo;
  strList : TStringList;
  verb : Smallint;
  flags : Word;
begin
  strList := TStringList.create();
  .....
  verbInfo.verb := verb;
  verbInfo.flags := flags;
  strList.addObject('verb1',TObject(VerbInfo));  //invalid typecast happened here
end;

誰能幫我? 非常感謝你

你可以嘗試這樣的事情:

function MakeVerbInfoObject(const AVerbInfo: TVerbInfo): TObject;
begin
  Result := nil;
  Move(AVerbInfo, Result, SizeOf(AVerbInfo));
end;

strList.addObject('verb1', MakeVerbInfoObject(VerbInfo));

如果SizeOf(TObject) = SizeOf(TVerbInfo)你的演員TObject(VerbInfo)將編譯。 TObject是一個指針,所以它的大小因架構而異。 另一方面, SizeOf(TVerbInfo)不隨體系結構而變化。 因此,演員表只能在一個架構上工作。

使用像這樣的演員是如何在預仿制Delphi中做的事情。 但是現在,你應該使用通用容器。

例如,如果您有一個列表並且字符串是唯一的,那么您可以使用字典:

TDictionary<string, TVerbInfo>

如果有可能存在重復的字符串,那么您需要一個新的記錄聲明:

type
  TVerbInfo = record
    Name: string
    Verb: Integer;
    Flags: Word;
  end;

然后存儲這些列表

TList<TVerbInfo>

最后一點是你應該避免使用打包記錄。 這會導致數據結構錯位,從而導致性能不佳。

我認為你必須在不同的平台上運行它並比較結果

ShowMessage( IntToStr( SizeOf( Integer ) ) );
ShowMessage( IntToStr( SizeOf( Pointer ) ) );
ShowMessage( IntToStr( SizeOf( TVerbInfo ) ) );
ShowMessage( IntToStr( SizeOf( TObject ) ) );

我懷疑你不能做硬打算,因為尺寸不同。

您可以嘗試使用類似的解決方法

type TBoth = record
  case byte of
    0: ( rec: TVerbInfo);
    1: ( obj: TObject);
  end;

您也可以嘗試使用TDictionary<String, TVerbInfo>類型而不是TStringList

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM