C++ 通过两个不同的可执行文件?

C++ 通过两个不同的可执行文件?,c++,boost,boost-asio,boost-interprocess,inter-process-communicat,C++,Boost,Boost Asio,Boost Interprocess,Inter Process Communicat,我有以下问题,我知道我需要通过共享内存或网络套接字使用IPC 我有一个用VS2010编译的可执行文件(意思是一个单独的.exe),它从某处获取数据,它应该使数据可供第二个可执行文件使用 boost::interprocess::managed_shared_memory managed_shm( boost::interprocess::open_or_create, "MyMemBlock", 4000000); 第二个可执行文件是用VS2012编译的,应该接收数据(

我有以下问题,我知道我需要通过共享内存或网络套接字使用IPC

我有一个用VS2010编译的可执行文件(意思是一个单独的.exe),它从某处获取数据,它应该使数据可供第二个可执行文件使用

boost::interprocess::managed_shared_memory managed_shm(
    boost::interprocess::open_or_create,
    "MyMemBlock",
    4000000);
第二个可执行文件是用VS2012编译的,应该接收数据(或从内存中提取)并对其进行处理

// fails with a boost::interprocess::interprocess_exception
boost::interprocess::managed_shared_memory managed_shm(
    boost::interprocess::open_only,
    "MyMemBlock");
整个过程需要尽可能快。 使用相同的Visual Studio版本编译两个可执行文件不是一个选项,一个代码库仅使用VS2010编译,另一个仅使用VS2012/2013编译


但是,我第一次尝试boost::interprocess时没有成功(第二个进程抛出boost::interprocess::interprocess_异常),我不完全理解内存是如何被共享的,或者更准确地说,共享内存信息是如何从一个进程传递到另一个进程的。第一个exe如何填充共享内存块的信息?它是否只适用于一个可执行文件中的多个进程?不是多个.exe?它必须是两个可执行文件使用的同一个boostdll吗?我唯一的选择是通过套接字IPC吗?

您可以尝试本机Windows IPC。你可以做很多。我推荐。这里还有一篇很好的文章

这是非持久化内存映射文件的示例场景

取自


Boost也有,它将根据编译目标平台使用本地低级API。示例代码可以在两个不同的可执行文件中使用。访问共享内存的两个进程不需要编译成同一个可执行文件。事实上,它们可以使用不同版本的VisualStudio和不同的boost DLL进行编译。但是,必须在两个可执行文件中使用相同版本的boost


非常有趣的是,同样不起作用的是,在发布版本中运行一个可执行文件,而在调试版本中运行另一个可执行文件。我猜他们分配内存的方式完全不同,无法共享。

您的整个问题描述由两个词组成,“未工作”。(顺便说一句,最常见的共享内存程序是让一个进程在共享内存中存储一个普通指针,然后让另一个进程尝试去引用它。在没有意识到的情况下很容易做到这一点。例如,你不能在共享内存中存储
std::string
,因为它可以做到这一点。)@我在函数抛出的第二个代码块中提到的DavidSchwartz。你必须向右滚动很多才能看到它。我更新了问题,使之更清楚。但我的主要问题是,这个共享内存IPC是否可以与使用2个不同boost DLL编译的2个不同的可执行文件一起工作。因为我的大脑无法想象第二个进程如何找到第一个进程的记忆。我能找到的所有例子都是使用一个可执行文件生成两个不同的进程。我认为不同的boost DLL应该不重要,但共享内存中数据的结构方式肯定会重要。您不应尝试共享任何二进制数据结构,而应仅共享纯序列化数据或基本数据类型。这两个应用程序是否都具有管理员权限?如果没有,试试看!事实上,我成功了。直到,你让我思考-我尝试了两种管理权限,但没有任何区别。但实际上,一个应用程序使用的是boost 1.53,另一个应用程序使用的是boost 1.55。然后我在两个吊杆上都试了1.53,成功了。所以我真正的问题得到了我自己的回答:是的,IPC不仅可以在一个可执行文件中跨两个进程工作,还可以跨使用不同编译器、不同libc、不同boost DLL的两个不同可执行文件工作,但它们必须使用相同的boost版本!内存映射文件确实是一个非常简单的解决方案。它应该是跨平台的。我怀疑这与我尝试使用boost ipc时遇到的问题是一样的:它能否处理使用2个不同库/libc DLL编译的2个不同的可执行文件?它不是跨平台的。但是你可以试试Boost,内存映射文件又快又简单!我推荐它们。谢谢大家的帮助。不过我有点被误解了:我的问题从来不是如何做IPC以及不同的方法是什么。我对此很熟悉。这都是关于2个可执行文件和不同的DLL。但是你给了我一些很好的链接和提示,谢谢!
1. Process A creates the memory-mapped file and writes a value to it.

2. Process B opens the memory-mapped file and writes a value to it.

3. Process C opens the memory-mapped file and writes a value to it.

4. Process A reads and displays the values from the memory-mapped file.

5. After Process A is finished with the memory-mapped file, the file is 
   immediately reclaimed by garbage collection.