【问题标题】:Create a DLL to share memory between two processes创建一个DLL在两个进程之间共享内存
【发布时间】:2013-07-16 01:01:34
【问题描述】:

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

动态链接库

int x;

void write(int temp)
{
  x = temp
}

int read()
{
 return x;
}

流程一:

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

【问题讨论】:

标签: c windows dll


【解决方案1】:

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

此代码很快被制作成一个框架,并且经过测试并且运行良好。根据您的最终应用程序,您可能需要一些同步,但这绝对是一个很好的垫脚石:

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 等。
【解决方案2】:

【讨论】:

  • 你能举一个简单的例子来说明我如何编写像上面这样简单的东西并使用这些数据段编译成 DLL 吗?
  • int x; 替换为#pragma data_seg (".myseg") int x = 0; #pragma data_seg() 并将/SECTION:.MYSEG,RWS 添加到您的链接器选项中
  • 我有一个工作示例并在下面提交。你的建议奏效了!!感谢您的帮助!
  • 链接断开。请在此处添加完整的回复以避免这种情况。
  • @OHLÁLÁ 我修复了链接并添加了另一个
【解决方案3】:

如果你想在进程之间共享内存,你不需要使用 DLL。 (这就是你在 16 位 Windows 中的做法,但那是差不多 20 年前的事了。)

相反,您需要使用memory-mapped files。您基本上在内存中创建了一个虚构文件,您的进程都可以看到并修改该虚构文件的内容。

【讨论】:

  • 我对 DLL 方法感兴趣的原因是因为我将编写的两个进程都在 LabVIEW 和 Lua 中,它们都具有本地 DLL 支持。我将不得不对这些“内存映射文件”进行一些研究。同时,您介意创建一组“hello world”风格的 C 进程,使用一个这样的 Mem 映射文件吗?
  • 没有什么可以阻止您的 DLL 创建内存映射文件。这是正确的解决方案。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多