创建DLL以在两个进程之间共享内存
我需要使用DLL的function类似于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的每个进程都有自己的所有DLL全局和静态变量的实例。
看到这里 。
如果要在进程之间共享内存,则不需要使用DLL。 (这就是你在16位Windows中的表现,但那是差不多20年前的事了。)
相反,您需要使用内存映射文件 。 您基本上在内存中创建一个虚构文件,您的进程可以全部查看和修改该虚构文件的内容。
你可以创建可由两个梨加载的dll,并且该dll创建一个共享内存块,它具有PutInMemory()和GetFromMemory()函数,每个进程加载它可以调用与使用该dll的其他进程通信,请参阅此https://msdn.microsoft.com/en-us/library/windows/desktop/ms686958(v=vs.85).aspx
虽然我接受了上面的解决方案,我还想发布我的代码,以防任何人有一个非常类似的问题,这可能会为他们节省一些工作。 该解决方案提供了解决我的问题的方法的一些背景知识,因此这是它的实际实现。
这段代码很快就被制作成了一个骨架,经过测试并且工作得很好。 根据您的最终应用,您可能需要一些同步,但它绝对是一个很好的垫脚石:
dlltest.h
#ifndef _DLLTEST_H_ #define _DLLTEST_H_ #include #include #include 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")