2

我需要使用 DLL 来实现类似于 Linux 共享内存的功能。我的 Windows 编程经验很少,但我认为可以实现我的目标。我想要类似下面的东西:

动态链接库

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,这就是我需要这种“过时”方法的原因。

4

4 回答 4

6

尽管我接受了上面的解决方案,但我还想发布我的代码,以防有人遇到非常相似的问题,这可能会为他们节省一些工作。该解决方案提供了有关解决我的问题的方法的一些背景知识,因此这里是它的实际实现。

这段代码很快就被做成了一个骨架,并且经过测试并且工作得很好。根据您的最终应用程序,您可能需要一些同步,但这绝对是一个很好的垫脚石:

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")  
于 2013-07-17T15:00:23.537 回答
3

If you want to share memory between processes, you don't need to use a DLL. (That was how you did it back in 16-bit Windows, but that was almost 20 years ago.)

Instead, you need to use memory-mapped files. You basically create an imaginary file in memory, and your processes can all see and modify the contents of that imaginary file.

于 2013-07-17T13:09:38.177 回答
3

默认情况下,每个使用 DLL 的进程都有自己的所有 DLL 全局变量和静态变量的实例。

请参阅动态链接共享库中的全局变量和静态变量会发生什么?

另请参阅https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/4636bfec-ff42-49ea-9023-ed7ff9b6a6fb/how-to-share-data-in-a-dllpragma-dataseg?forum= vc语言

于 2013-07-17T13:03:16.643 回答
1

您可以创建两个对等方均可加载的 dll,并且该 dll 创建一个共享内存块,它具有 PutInMemory() 和 GetFromMemory() 函数,每个进程加载它可以调用它以与使用 dll 的其他进程进行通信,请参阅此https://msdn.microsoft.com/en-us/library/windows/desktop/ms686958(v=vs.85).aspx

于 2016-12-31T08:52:08.857 回答