Figure 3: Creation and mapping of mapped file for shared memory
BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID reserved) { if (reason == DLL_PROCESS_ATTACH) { memCounter++; if (memCounter == 1) // 1st one makes the file CreateMappedFile(MEMORY_LIMIT); else CreateMappedFile(0); // others only map to the file } else memCounter--; return true; } // // Create and/or map the mapped file in the temp directory BOOL CreateMappedFile(int size) { HANDLE h; char szTmpFile[256]; char *testbase; if (size == 0) { // ONLY MAP TO THE FILE IF SIZE IS 0. h = OpenFileMapping (FILE_MAP_WRITE,TRUE,"embsqlmemory"); if (h != NULL) { testbase = (char *)MapViewOfFileEx(h, FILE_MAP_WRITE, 0,0,0,sharedMemoryFile); if (sharedMemoryFile != testbase) return false; hMapFile = h; return true; } // // Need to make the file AND map it // GetTempPath (256, szTmpFile); sprintf(mapFileName,"%s%s",szTmpFile,"embsql.tmp"); // Create the file, stomp on whatever was there h = CreateFile (mapFileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL); if (h == (HANDLE)INVALID_HANDLE_VALUE) return false; // Create the mapping, this sets the shared memory regions // object name so subsequent users can get at it h = CreateFileMapping (h, NULL,PAGE_READWRITE, 0, size, "embsqlmemory"); // Set the pointers into the shared memory region sharedMemoryFile = (char *)MapViewOfFile (h, FILE_MAP_WRITE, 0, 0, 0); memoryLimitF = &sharedMemoryFile[size]; curPtrF = sharedMemoryFile; hMapFile = h; return true; }