创建一个可以在两个进程之间共享内存的DLL

3
我需要使用DLL来实现类似于Linux共享内存的功能。我对Windows编程经验非常有限,但我认为可以实现我的目标。我想要做类似下面的事情:

DLL

int x;

void write(int temp)
{
  x = temp
}

int read()
{
 return x;
}

步骤1:

LoadDLL();
write(5); //int x = 5 now

步骤2:

LoadDLL();
printf(read()); //prints 5 since int x = 5 from Proccess 1

自然地,这个例子忽略了竞争条件等问题,但是有没有一种简单的方法来处理这样的事情?
我将使用Microsoft Visual Studio 10创建DLL。 有人能解释一下我如何编写这么简单的代码并将其构建为一个DLL,以便可以像上面的伪代码一样加载和调用它吗?
编辑:由于我创建的进程在LabVIEW和Lua中,因此无法使用共享内存段和内存映射文件。 然而,它们支持DLL,这就是为什么我需要这种“过时”的方法的原因。

我认为这个问题稍微有些不同。我的要求是使用DLL,而其他问题采用了Joe White在这里建议的方法来使用内存映射文件。虽然内存映射文件也可能有效,但它对于满足我的需求来说会更具挑战性(如果不是不可能的话)。 - MrHappyAsthma
请参阅 https://blogs.msdn.microsoft.com/oldnewthing/20040804-00/?p=38253 了解为什么这是一个非常糟糕的想法的描述。 - Harry Johnston
4个回答

7
虽然我接受了上面的解决方案,但我也想发布我的代码,以防有人遇到非常相似的问题,这可能会为他们节省一些工作。该解决方案提供了一些背景知识,介绍了解决我的问题的方法,因此这里是其实际实现。
这个代码很快就做好了,经过测试完全正常工作。根据您的最终应用程序,您可能需要进行一些同步,但它绝对是一个很好的起点:
dlltest.h
#ifndef _DLLTEST_H_
#define _DLLTEST_H_

#include <iostream>
#include <stdio.h>
#include <windows.h>

extern "C" __declspec(dllexport) int get();
extern "C" __declspec(dllexport) void set(int temp);


 #endif

dlltest.cpp

#include "dlltest.h"

#pragma data_seg("SHARED")
int x = 0;
#pragma data_seg()

extern "C" __declspec(dllexport)

int get()
{
    return x;
} 

extern "C" __declspec(dllexport)

void set(int temp)
{
    x = temp;
}

#pragma comment(linker, "/section:SHARED,RWS")  

请注意,除非您是管理员并具有UAC访问权限,否则此操作无法在Vista / W7等系统上运行。 - cup

4

你能否展示一个简单的例子,说明如何像上面那样编写代码,并使用这些数据段编译成DLL? - MrHappyAsthma
#pragma data_seg (".myseg") int x = 0; #pragma data_seg() 替换 int x;,并在链接器选项中添加 /SECTION:.MYSEG,RWS - jsp
我有一个可工作的例子,并在下面提交了它。你的建议起作用了!感谢你的帮助! - MrHappyAsthma
链接已损坏。请在此处添加完整响应以避免此类情况发生。 - Mokus
1
@OHLÁLÁ 我修复了链接并添加了另一个。 - jsp

4
如果您想在进程之间共享内存,不需要使用DLL。(这是在16位Windows中的做法,但那已经快20年了。)相反,您需要使用内存映射文件。您基本上在内存中创建一个虚拟文件,您的进程都可以看到和修改该虚拟文件的内容。

1
我对DLL方法感兴趣的原因是我将编写的两个进程都使用LabVIEW和Lua,它们都具有本地DLL支持。我将不得不对这些“内存映射文件”进行一些研究。与此同时,您是否介意创建一个使用这样的Mem Map文件的“hello world”风格的C进程集? - MrHappyAsthma
2
你的DLL可以创建一个内存映射文件,没有任何阻碍。这是正确的解决方案。 - Harry Johnston

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接