【问题标题】:Delphi: String[255] in 32-bit vs 64-bitDelphi:32 位与 64 位中的字符串 [255]
【发布时间】:2019-09-21 12:20:32
【问题描述】:

我使用以下内容在 2 个可执行文件之间共享一个短字符串:

Type
  PInstanceInfo = ^TInstanceInfo;
  TInstanceInfo = packed record
    MainAppHandle: THandle;
    SessionPath: String[255];
  end;
Var MappingHandle: THandle;
    InstanceInfo: PInstanceInfo;

  MappingHandle := CreateFileMapping(INVALID_HANDLE_VALUE,
                                     nil,
                                     PAGE_READWRITE,
                                     0,
                                     SizeOf(TInstanceInfo),
                                     PChar('MyApp'));

  InstanceInfo := MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TInstanceInfo));
  InstanceInfo^.MainAppHandle := Application.Handle;

我使用 SessionPath 来存储文件的路径。当两个应用程序都是 x86 或 x64 时,这工作正常,但是当 App1 是 32 位并且 App2 是 64 位时,App2 在我读取它时缺少字符串的前 4 个字符。在这种情况下,ShortString 结构有什么不同?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    THandle 是指针大小的。所以它是 32 位或 64 位,具体取决于平台。这解释了缺少的 4 个字节。事实上,通过在测试程序中使用SizeOf 函数,您可以很容易地看到这一点。

    【讨论】:

    • 通过将 THandle 更改为 FixedUInt 来修复它。谢谢
    • 我假设内存映射是正确的解决方案,但通常不是。
    • 请注意 Application.HandleHWND 而不是 THandle。您可以跨流程边界释放HWNDs 传输。尽管 HWND 是指针大小的类型,所以您仍然会遇到相同的字节大小问题,但 HWNDs 被设计为 32 位值,因此它们可以在从 32 位传递到 64 位时安全地扩展,并在从 64 位传递时截断到 32 位。见How can I share HWND between 32 and 64 bit applications in Win x64?
    • THandle 和 HWND 都指向同一个 NativeUInt 类型,所以这是同一个问题。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2011-11-22
    • 2016-03-08
    相关资源
    最近更新 更多