Главная страница | назад





Article #17405: Using File Mapping for Shared Data.

 Question and Answer Database
FAQ2405C.txt Using File Mapping for Shared Data.
Category :Windows API
Platform :All
Product :C++Builder ALL
Question:
With the introduction of Win32 we can no longer use DLL's to
share memory between proccesses. I was told to use FileMapping.
What is FileMapping and how do I do this?
Answer:
You use file maping to set segments into shared spaces so that 2
or more different processes have access to the same segment to
share data. Below is an example that walks you though filemapping.
#include 
#include 
#include 
#pragma hdrstop
//structure that will be shared
typedef struct INFO_TAG {
int nThing;
char sThing[256];
}INFO, *LPINFO;
//globals to store the mapped info
static HANDLE hMemMap;
static HANDLE hFile;
static void *pMapView;
//this function will create the file mapping
bool __stdcall SetupFileMap(void)
{
bool bExists;
//create a file to map to
hFile = CreateFile("temp",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_DELETE_ON_CLOSE,
NULL);
//create the mapping to the file
hMemMap = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
sizeof(INFO),
"FM_MemMap");
//see weather this is the first time this file has been mapped to
bExists = (GetLastError() == ERROR_ALREADY_EXISTS);
//Map a view into the Mapped file
pMapView = MapViewOfFile(hMemMap,
FILE_MAP_ALL_ACCESS,
0,
0,
sizeof(INFO));
if (!bExists)
{
//if it is the first time this map has been made,
//set all the members of our struct to NULL
memset (reinterpret_cast(pMapView), NULL, sizeof(INFO));
}
return true;
}
LPINFO __stdcall GetSharedInfo (void)
{
//return a pointer to the mapped file
return (reinterpret_cast(pMapView));
}
void __stdcall ShutdownFileMap(void)
{
//clean up after yourself
UnmapViewOfFile(pMapView);
CloseHandle(hMemMap);
CloseHandle(hFile);
}
//test to show how to access the mapped file
int main(int, char**)
{
LPINFO Map = NULL;
char cInput = NULL;
SetupFileMap();
Map = GetSharedInfo();
cInput = 'z';
do
{
switch(cInput)
{
case 'c': cout << "Enter integer: ";
cin>> Map->nThing;
cout << "Enter string: ";
cin>> Map->sThing;
cInput = 'z';
break;
case 'd': cout << "Integer = " << Map->nThing << endl;
cout << "String = " << Map->sThing << endl;
cInput = 'z';
break;
default : cout << "Enter e to exit" << endl;
cout << " c to change data in the mapped file" << endl;
cout << " d to display the data in the mapped file" << endl;
cin>> cInput;
break;
}
} while(cInput != 'e');
ShutdownFileMap();
return 0;
}
7/2/98 10:32:32 AM

Last Modified: 01-SEP-99