内存映射文件无法通过创建它的进程找到

鲍勃·霍普纳

我的目标是在64位Windows 8上使用.Net Framework 3.5(可惜该项目不是4.0+)。我最初认为问题是ProcessB无法找到ProcessA生成的内存映射文件,但甚至找不到即使句柄不错,ProcessA仍可以找到它刚创建的文件,并且可以用来写入和读取文件。在代码示例中,我在调用CreateFileMapping之后立即调用OpenFileMapping,但是即使将数据写入文件后,它也会失败。我在CreateFileMapping中使用文件映射属性,使其变长并传入0,使其成为SECURITY_ATTRIBUTES结构,并为lpSecurityDescriptor传入IntPtr.Zero,所有这些都不令人高兴。我也尝试了FileMapAccess ReadWrite和AllAccess却没有任何乐趣。我也尝试过使memoryfilename不恒定。一世' 我不知道为什么找不到映射文件,即使创建它的过程也找不到。以下是涉及的代码的基本内容:

private IntPtr hHandle;
private IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
public const Int64 FILESIZE = 1024 * 1024;
private const string memoryfilename = "myfilename";

//CreateFileMapping
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern IntPtr CreateFileMapping(
IntPtr hFile,
IntPtr lpFileMappingAttributes,
FileMapProtection flProtect,
uint dwMaximumSizeHigh,
uint dwMaximumSizeLow,
[MarshalAs(UnmanagedType.LPStr)] string lpName);

//OpenFileMapping
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr OpenFileMapping(
FileMapAccess dwDesiredAccess,
Int32 bInheritHandle, 
[MarshalAs(UnmanagedType.LPStr)] string lpName);

[Flags]
public enum FileMapAccess : uint
{
  FileMapCopy = 0x0001,
  FileMapWrite = 0x0002,
  FileMapRead = 0x0004,
  FileMapReadWrite = 0x0006,
  FileMapAllAccess = 0x001f,
  FileMapExecute = 0x0020,
}

[Flags]
enum FileMapProtection : uint
{
  PageReadonly = 0x02,
  PageReadWrite = 0x04,
  PageWriteCopy = 0x08,
  PageExecuteRead = 0x20,
  PageExecuteReadWrite = 0x40,
  SectionCommit = 0x8000000,
  SectionImage = 0x1000000,
  SectionNoCache = 0x10000000,
  SectionReserve = 0x4000000,
}

//hHandle becomes non-zero
hHandle= CreateFileMapping(
INVALID_HANDLE_VALUE, IntPtr.Zero, FileMapProtection.PageReadWrite,
(uint)0, (uint)FILESIZE, memoryfilename);

//hHandle2 stays zero
IntPtr hHandle2 = OpenFileMapping(FileMapAccess.FileMapWrite, 0, memoryfilename);

//myerror is 2 ERROR_FILE_NOT_FOUND
uint myerror = GetLastError();

//this works and I can read/write the file through UnmanagedMemoryStream
pBuffer = MapViewOfFile(hHandle, FileMapAccess.FileMapWrite, 0, 0, (uint)FILESIZE);
戴维·赫弗南
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern IntPtr CreateFileMapping(
    IntPtr hFile,
    IntPtr lpFileMappingAttributes,
    FileMapProtection flProtect,
    uint dwMaximumSizeHigh,
    uint dwMaximumSizeLow,
    [MarshalAs(UnmanagedType.LPStr)] 
    string lpName
);

DllImport属性使用CharSet.Auto,意味着将使用该函数的宽字符版本。然后,您使用传递ANSI编码的字符串UnmanagedType.LPStr正如汉斯所说,这意味着当系统将您提供的ANSI编码文本解释为UTF-16编码时,您的名字将会被修饰。

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr OpenFileMapping(
    FileMapAccess dwDesiredAccess,
    Int32 bInheritHandle, 
    [MarshalAs(UnmanagedType.LPStr)] 
    string lpName
);

这次您省略了CharSet.Auto,因此这次默认为``CharSet.Ansi is used. And so the ANSI version of the function is used, which matchesUnmanagedType.LPStr` '' 因此,将传递预期的名称。

所有这些都解释了系统为什么报告ERROR_FILE_NOT_FOUND

修复p / invoke声明,一切都会好起来。

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern IntPtr CreateFileMapping(
    IntPtr hFile,
    IntPtr lpFileMappingAttributes,
    FileMapProtection flProtect,
    uint dwMaximumSizeHigh,
    uint dwMaximumSizeLow,
    string lpName
);

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern IntPtr OpenFileMapping(
    FileMapAccess dwDesiredAccess,
    bool bInheritHandle, 
    string lpName
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法分配内存:fork:无法分叉新进程:服务器apache,如何找到源代码并修复它?

来自分类Dev

如何在python中映射/加载内存中的文件并从另一个进程访问它?

来自分类Dev

无法通过JBoss Eclipse插件创建休眠映射文件

来自分类Dev

ITextSharp-创建PDF文件后,它卡在IIS工作进程中,无法移动

来自分类Dev

丢失的目录无法通过testdisk找到它

来自分类Dev

Android进程内存映射

来自分类Dev

无法写入内存映射文件

来自分类Dev

C ++:Boost进程间内存映射文件错误

来自分类Dev

HDFS中的映射器文件无法通过流jar找到

来自分类Dev

HDFS中的映射器文件无法通过流jar找到

来自分类Dev

该进程无法访问该文件,因为它正在被另一个进程使用(已创建文件但不包含任何文件)

来自分类Dev

为什么它无法通过jQuery找到id值

来自分类Dev

为什么它无法通过jQuery找到id值

来自分类Dev

如何创建和写入内存映射文件?

来自分类Dev

将进程内存转储到文件/从转储文件重新创建进程

来自分类Dev

在Java中启动单独的进程,无法找到.png文件

来自分类Dev

内存映射和文件排序后无法计算字节

来自分类Dev

内存映射和文件排序后无法计算字节

来自分类Dev

内存映射文件时“无法读取或写入fd”

来自分类Dev

内存映射的文件代码在C ++中无法正常工作

来自分类Dev

内存映射和文件排序后无法计算字节

来自分类Dev

内存映射文件时“无法读取或写入fd”

来自分类Dev

远程文件内存映射

来自分类Dev

Linux内存映射文件

来自分类Dev

内存映射文件位置

来自分类Dev

进程无法访问文件“...”,因为它正被另一个进程使用

来自分类Dev

Kubernetes中Docker容器中的内存映射文件是否与Linux中的常规进程相同?

来自分类Dev

如何读取文件名,找到它并通过Java打开它

来自分类Dev

内存映射与64位进程堆

Related 相关文章

  1. 1

    无法分配内存:fork:无法分叉新进程:服务器apache,如何找到源代码并修复它?

  2. 2

    如何在python中映射/加载内存中的文件并从另一个进程访问它?

  3. 3

    无法通过JBoss Eclipse插件创建休眠映射文件

  4. 4

    ITextSharp-创建PDF文件后,它卡在IIS工作进程中,无法移动

  5. 5

    丢失的目录无法通过testdisk找到它

  6. 6

    Android进程内存映射

  7. 7

    无法写入内存映射文件

  8. 8

    C ++:Boost进程间内存映射文件错误

  9. 9

    HDFS中的映射器文件无法通过流jar找到

  10. 10

    HDFS中的映射器文件无法通过流jar找到

  11. 11

    该进程无法访问该文件,因为它正在被另一个进程使用(已创建文件但不包含任何文件)

  12. 12

    为什么它无法通过jQuery找到id值

  13. 13

    为什么它无法通过jQuery找到id值

  14. 14

    如何创建和写入内存映射文件?

  15. 15

    将进程内存转储到文件/从转储文件重新创建进程

  16. 16

    在Java中启动单独的进程,无法找到.png文件

  17. 17

    内存映射和文件排序后无法计算字节

  18. 18

    内存映射和文件排序后无法计算字节

  19. 19

    内存映射文件时“无法读取或写入fd”

  20. 20

    内存映射的文件代码在C ++中无法正常工作

  21. 21

    内存映射和文件排序后无法计算字节

  22. 22

    内存映射文件时“无法读取或写入fd”

  23. 23

    远程文件内存映射

  24. 24

    Linux内存映射文件

  25. 25

    内存映射文件位置

  26. 26

    进程无法访问文件“...”,因为它正被另一个进程使用

  27. 27

    Kubernetes中Docker容器中的内存映射文件是否与Linux中的常规进程相同?

  28. 28

    如何读取文件名,找到它并通过Java打开它

  29. 29

    内存映射与64位进程堆

热门标签

归档