Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a DLL to share memory between two processes

Tags:

c

windows

dll

I need to use DLL's to function similar to Linux Shared Memory. I have very little Windows programming experience, but I think it is possible to accomplish my goal. I want to so something similar to below:

DLL

int x;

void write(int temp)
{
  x = temp
}

int read()
{
 return x;
}

Process 1:

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

Process 2:

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

Naturally this example neglects race conditions and the like, but is there a simple way to go about something like this?

I would be using Microsoft Visual Studio 10 to create the DLL. Could someone explain how I would write something this simple and build it into a DLL that can be loaded and called similar to the pseudo-code above?

EDIT: Shared memory segments and Memory Mapped Files cannot be used because the processes I am creating are in LabVIEW and Lua which do not support the above. They do, however, support DLLs which is why I need this "outdated" approach.

like image 372
MrHappyAsthma Avatar asked Jun 08 '26 21:06

MrHappyAsthma


1 Answers

Althought I accepted the solution above, I wanted to also post my code in case anyone has a very similar issue this might save them some work. The solution provides some background knowledge on the approach that solved my problem, so here is an actual implementation of it.

This code was quickly made as a skeleton and is tested and works perfectly fine. You may need some synchronization depending on your final application, but it is definitely a good stepping stone:

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")  
like image 200
MrHappyAsthma Avatar answered Jun 11 '26 17:06

MrHappyAsthma



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!