Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;用Java阅读 我有一个C++程序,它使用一个点 hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName);_Java_C++_Winapi_Nio_Memory Mapped Files - Fatal编程技术网

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:AFAIK
OpenFileMapping
在Java中不存在,等价物是什么?我不知道Java库是否支持打开命名映射
MappedByteBuffer
似乎要求您手头有一个文件系统文件名。我倾向于使用JNI或JNA。我认为asker想要打开一个现有的映射,一个由不同的process@DavidHeffernan:是的。我也明白这一点。CreateFileMapping将创建新的或打开基于真实文件的现有文件映射(与OpenFileMapping不同,OpenFileMapping将打开一个现有映射或创建一个不基于任何真实文件的新映射。CreateFileMapping需要一个文件句柄。在我看来,用户将无法获得该文件句柄。因此,OpenFileMapping是必需的。获得文件句柄与
CreateFile一样困难具有特定的文件名。可以使用不同的句柄(对同一文件)在每个过程中。使用文件名可以创建一个MappedByteBuffer对象…为什么用户知道这个特定的文件名?我想象用户只有文件映射对象的名称。这并没有太大的想象力,因为这是问题中写的。嗨,这不起作用,请检查中的“非持久内存映射文件”。我指的是IPC的共享内存