C++;用Java阅读 我有一个C++程序,它使用一个点 hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName);
C++;用Java阅读 我有一个C++程序,它使用一个点 hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName);,java,c++,winapi,nio,memory-mapped-files,Java,C++,Winapi,Nio,Memory Mapped Files,lpName类似于没有扩展名或路径的“myfile”,即内存映射文件。我可以在路径Sessions\1\BaseNamedObjects\myfile中使用WinObj浏览器()找到该文件。如果我尝试用Java读取特定文件,我会尝试 File file = new File("myfile"); FileChannel filechannel = new RandomAccessFile(file, "r").getChannel(); MappedByteBuffer buffer = fil
lpName
类似于没有扩展名或路径的“myfile”
,即内存映射文件。我可以在路径Sessions\1\BaseNamedObjects\myfile
中使用WinObj浏览器()找到该文件。如果我尝试用Java读取特定文件,我会尝试
File file = new File("myfile");
FileChannel filechannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = filechannel.map(FileChannel.MapMode.READ_ONLY, 0, filechannel.size());
但我总是遇到同样的错误:在RandomAccessFile
命令中找不到指定的文件。也许需要另一个文件访问权限?哪一个
正如我从其他帖子中了解到的,他们总是使用路径和扩展,然而,我不知道路径和扩展会出现在我的情况下
我正在寻找的是一种访问内核对象名称空间的方法
我知道,有一个JNI示例(),但是我希望它保持简单,并使用nio
(如果可能的话)
更新
因此,我只是用C语言尝试了整个过程,非常简单,只需要5行代码。您需要使用
CreateFileMapping
而不是OpenFileMapping
。这样,您将在磁盘上创建一个与文件映射关联的实际文件
注意:需要注意的是,使用常规读/写方法不会与不同进程的文件映射同步。因此,您仍然需要在Java中使用MappedByteBuffer之类的东西,文件就是文件,我同意“Joachim Pileborg”的说法,即Java程序的工作目录中没有该文件。试一试
String working dir = System.getProperty("user.dir");
并确保文件处于正确的路径。< /P> C++程序的当前工作目录是什么?这就是创建文件的地方。如果未指定绝对路径,则将在进程当前工作目录的相对路径中创建文件名。如果C++和java程序的两个工作目录不相同,则不能真正使用相对路径,则应该指定一个绝对路径,在两个程序中都相同,以找到文件。@ ErWiBurvist:是的,它确实存在,我在该问题中写道,在WiNbjr浏览器中测试java应用程序时,我可以访问该文件。JoachimPileborg:它类似于
C:\Project\server`,愚蠢的问题:文件在
explorer`中不可见,但我想它不应该可见?文件映射对象不是文件系统的一部分。工作目录不相关。您还需要调用OpenFileMapping
RandomAccessFile
不会这样做。@DavidHeffernan:AFAIKOpenFileMapping
在Java中不存在,等价物是什么?我不知道Java库是否支持打开命名映射MappedByteBuffer
似乎要求您手头有一个文件系统文件名。我倾向于使用JNI或JNA。我认为asker想要打开一个现有的映射,一个由不同的process@DavidHeffernan:是的。我也明白这一点。CreateFileMapping将创建新的或打开基于真实文件的现有文件映射(与OpenFileMapping不同,OpenFileMapping将打开一个现有映射或创建一个不基于任何真实文件的新映射。CreateFileMapping需要一个文件句柄。在我看来,用户将无法获得该文件句柄。因此,OpenFileMapping是必需的。获得文件句柄与CreateFile一样困难代码>具有特定的文件名。可以使用不同的句柄(对同一文件)在每个过程中。使用文件名可以创建一个MappedByteBuffer对象…为什么用户知道这个特定的文件名?我想象用户只有文件映射对象的名称。这并没有太大的想象力,因为这是问题中写的。嗨,这不起作用,请检查中的“非持久内存映射文件”。我指的是IPC的共享内存