delphi 中用于内存映射文件的 C# 等效代码
C# Equivalent code in delphi for 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 的等价物 Class,但仍然无法对 Delphi-7 中的其余部分进行编码。
"MemoryMappedFile" 是一个 class,它确实使用操作系统的 memory mapped files 功能来访问文件内容。
C#下没有指针,所以是面向流的布局。但是在 Delphi 下,你有指针,所以你可以很容易地直接在它上面使用指针。
我们的 SynCommons.pas 单元中有一个 TSynMemoryStreamMapped
class,它适用于 Delphi 7(及以上),并且完全符合 "MemoryMappedFile" 做。您可以考虑 TFileBufferReader
或直接 TMemoryMap
和一个 PByteArray。
但是如果你从头到尾读取一个文件,使用内存映射文件是不值得的。在这种情况下,可以通过使用缓冲流来实现按块读取文件。如果您的文件不大,只需使用 TMemoryStream
类型的流。
内存映射文件是 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
我从供应商之一那里得到了代码,可以从 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 的等价物 Class,但仍然无法对 Delphi-7 中的其余部分进行编码。
"MemoryMappedFile" 是一个 class,它确实使用操作系统的 memory mapped files 功能来访问文件内容。
C#下没有指针,所以是面向流的布局。但是在 Delphi 下,你有指针,所以你可以很容易地直接在它上面使用指针。
我们的 SynCommons.pas 单元中有一个 TSynMemoryStreamMapped
class,它适用于 Delphi 7(及以上),并且完全符合 "MemoryMappedFile" 做。您可以考虑 TFileBufferReader
或直接 TMemoryMap
和一个 PByteArray。
但是如果你从头到尾读取一个文件,使用内存映射文件是不值得的。在这种情况下,可以通过使用缓冲流来实现按块读取文件。如果您的文件不大,只需使用 TMemoryStream
类型的流。
内存映射文件是 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