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