C#内存映射文件的delphi中的等效代码

时间:2016-06-28 09:40:27

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

我从其中一个供应商处获取了代码,用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中的其余部分。

2 个答案:

答案 0 :(得分:4)

内存映射文件是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

答案 1 :(得分:3)

&#34; MemoryMappedFile&#34;是一个使用操作系统的memory mapped files功能来访问文件内容的类。

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

我们的SynCommons.pas单元中有一个TSynMemoryStreamMapped类,适用于Delphi 7(及以上版本),并且完全符合&#34; MemoryMappedFile&#34;确实。您可以考虑TFileBufferReader或直接TMemoryMap和PByteArray。

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