Motivation

Sometimes you need to share some values across several
processes. There are some ways, provided by system, but there is no simple way to
share simple values like DWORDs or strings. And
of course, synchronization is also required in this case.

Description of solution

I was inspired by PJ Naughter'ssolution, but I wanted more.
I wanted structured shared memory, with variables, synchronization and wait functionality within it.

Internal structure

Variables are shared within an unnamed memory file. This 'file' (or better, block
of memory) is allocated in the page file. It is not possible to create growable
file of this type, but I did not require it. The internal structure of this memory is
as follows:

Member wszValueName is value name,
dwLength is length in bytes of the value, which
follows this structure. As you can see, the actual value is stored as several bytes.
There is no type checking of the value's type. It is not allowed access the variable
directly. Instead of that, the class provides several methods to access values. It
allows synchronized access, and it is possible to wait for value or memory changes.

Remarks

Constructor for the class. It creates shared memory named szName, of
dwSize< size. When you want initialize memory at the
same place as you declare it, you can define an initializer function,
defined as:

void InitMemory(CSharedMemory *pMem, void *pInitProcParam)

And you can pass its address to the constructor. This solution allows you write shorter code
like:

...
CSharedMemory sh_mem("MemoryName",1024,InitMemory);
...

'Initialize' means, for example to add some variables. If you need to pass your own initialization
value, then you can specify it in the pInitProcParam parameter. If you don't provide this
value at the construction time, then constructor will pass NULL to your
initializer function. lpsaAttributes defines access control rights and
security attributes of the memory mapped file, semaphore and events created inside
the CSharedMemory object. For more information see
SECURITY_ATTRIBUTES.

Remarks

This method adds new value named szName. It creates a new entry within memory and reserves
space of size for new value. If it fails, returns FALSE, otherwise
TRUE. You can use the last parameter to set its value after it is created. Call
CSharedMemory::GetLastError() to
retrieve the error code.

Remarks

Method adds new DWORD value named szName. It creates
a new entry within memory and reserves space of size
for new value. If it fails, it returns FALSE, otherwise
TRUE. You can use last parameter to set its value after it is created. Call
CSharedMemory::GetLastError() to
retrieve the error code.

Remarks

This method deletes the value named szName from memory, it frees used space and
freed memory is filled with zeros. If it fails, it returns FALSE, otherwise
TRUE. Call CSharedMemory::GetLastError() to
retrieve error code.

Remarks

This method sets the variable named szName to value
pointed to by bData. Length of the data at address bData is passed
as the last parameter. It can be less then allocated length within shared memory. In this case the
rest of the allocated buffer is filled with zeros. If it fails, it returns FALSE, otherwise
TRUE. Call CSharedMemory::GetLastError()
to retrieve the error code.

Remarks

This method retrieves thevalue of the variable szName.
Data is stored at address bData. The length stored at bData is
returned in dwLength. It is possible to pass in bData NULL,
then the method returns in dwLength the required buffer length. If it fails,
it returns FALSE, otherwise TRUE. Call CSharedMemory::GetLastError()to
retrieve the error code.

Remarks

This method waits for any change in the structure of the
shared memory. 'Change' means add or delete a variable. When you do
not use variables, but direct access functions, then you can use this
method to wait for the changes. For direct access see
CSharedMemory::Read() or
CSharedMemory::Write().
If it fails, it returns WAIT_FAILED value, see also WaitForSingleObject() .

Remarks

This methods waits for changes of values. It also returns when
variables are deleted. You can choose to wait for change of one or several values. If it fails,
it returns WAIT_FAILED value, see also WaitForMultipleObject().

All Interlocked* functions are described in the MSDN. Methods of CSharedMemory work the
same way, except they return TRUE/FALSE as an indicator of success, and
the return value of emulated functions is returned through a pointer (usually the last
optional parameter).

Remarks

CSharedMemory::Read

BOOL Read(BYTE *pbData, DWORD dwLength, DWORD dwOffset = 0);

Remarks

This method reads dwLength bytes from offset
dwOffset within memory. It is allowed to access shared memory this way only
when it contains no variables. Method writes data at the address
pbData. If it fails, it returns FALSE, otherwise TRUE. Call
CSharedMemory::GetLastError()
to retrieve the error code.

Remarks

Method writes dwLength bytes from pbData at the offset
dwOffeset within the shared memory. It is allowed
to access shared memory this way only when it contains no
variables. If it fails, it returns FALSE, otherwise TRUE. Call CSharedMemory::GetLastError()
to retrieve the error code.

Remarks

Remarks

Dumps the contents of shared memory to a CDumpContext object.

Usage

I have provided a simple demo program to demonstrate usage of
the CSharedMemory class. A shared block of the memory exists within the system
until the last instance of the CSharedMemory class is
destroyed. CSharedMemory is UNICODE enabled; it will work in
UNICODE or ANSI programs. It is possible to share the same memory from both
types of programs. CSharedMemory uses simple diagnostic functions from
Helpers.h and Helpers.cpp

Demo program

The demo program provides an interface to the many methods
of CSharedMemory, and you can use more instances of it to play with
CSharedMemory and see how it works. It also demonstrates usage of the class.

History

4 Dec 2001 - updated source code

13 Jan 2001 - updated source code and new constructor

24 Sep 2002 - new and improved functionality from Angela Aremu
(AddDwordValue(), WaitForMultipleValuesChanges() and new parameter in AddValue())

Credits

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

thanks Steve, but i'm seeking for any application, any person than worked with the mm.h library, i need make a proyect about client/server wich the server mounts a shared memory segment (a random numbers linked list ) to several clients can read de list and i need think in the concurency (with semaphores).

Any idea???

i'm taking a course of advanced linux, and is very dificult...i'm programming in C