【问题标题】:C# Equivalent code in delphi for memory mapped files [closed]delphi中用于内存映射文件的C#等效代码[关闭]
【发布时间】:2016-06-28 09:40:27
【问题描述】:

我从其中一家供应商处获得了用于从 C# 中的内存映射文件中读取内容的代码,但由于限制,我需要使用 Delphi-7 语言开发代码。我得到的代码写在下面。

该工具正在从硬件模块读取模拟输入。

谁能帮我在 Delphi 中找到 C# 的等效代码?我的 C# 代码如下-

MemoryMappedFile file = MemoryMappedFile.OpenExisting("MY_SHARED_LOCATION");
MemoryMappedViewAccessor reader = file.CreateViewAccessor();
for (int i = 0; i < 16; i++)
{
         inputByte[i + 1] = reader.ReadByte(i);
}

我找到了等效的 MemoryMappedFile 类,但仍然无法在 Delphi-7 中编写其余部分。

【问题讨论】:

标签: c# delphi delphi-7 memory-mapped-files


【解决方案1】:

Memory Mapped Files 是 Windows 为不同进程提供共享内存的功能。

我目前无法使用 Delphi 编译器来测试它,但它应该会让您走上正确的道路。我还根据您提供的代码示例做出一些假设:您只打算读取数据,您将准确读取 16 个字节。如果这些无效,您必须相应地更改代码。

hFile := OpenFileMapping(FILE_MAP_READ, FALSE, "MY_SHARED_LOCATION");
Win32Check(hFile);
try
  //Buffer must be a byte pointer
  buf := MapViewOfFile(hFile, FILE_MAP_READ, 0, 0, 16);
  Win32Check(buf);
  try
    //Use buf^ as you please
  finally
    UnmapViewOfFile(buf);
  end;
finally
  CloseHandle(hFile);
end;

有关各种内存映射 API 例程的详细信息,请参阅以下内容:

https://msdn.microsoft.com/en-au/library/ms810613.aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx

【讨论】:

  • 感谢您对上述代码的帮助。对我来说效果很好。
【解决方案2】:

“MemoryMappedFile”是一个使用操作系统的memory mapped files 特性来访问文件内容的类。

在C#下,没有指针,所以是面向流的布局。但是在 Delphi 下,你有指针,所以你可以很容易地直接在它上面使用指针。

在我们的SynCommons.pas 单元中有一个TSynMemoryStreamMapped 类,它适用于Delphi 7(及更高版本),并且完全符合“MemoryMappedFile”的功能。您可以考虑TFileBufferReader 或直接TMemoryMap 和一个PByteArray。

但是如果你从头到尾读取一个文件,那么使用内存映射文件是不值得的。在这种情况下,可以通过使用缓冲流来实现按块读取文件。如果您的文件不是很大,只需使用TMemoryStream 类型的流。

【讨论】:

  • 如果提问者不想接受这个第三方依赖怎么办?
  • @DavidHeffernan 当然,Delphi 7 RTL 中的“MemoryMappedFile”类没有直接等效项。我怀疑直接使用 API 调用和处理指针是否在提问者的技能范围内。因此,我提出了一个提供相同功能集的即用型类。作为第三方库的一部分,当然,因为在 Delphi 7 中没有这样的类。那么,如果文件大小不是太大,问题的最接近的等价物是使用 TMemoryStream.LoadFromFile - 正如我在我的回答。
猜你喜欢
  • 2011-12-12
  • 2014-06-11
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
相关资源
最近更新 更多