2011-12-27 17 views
0

我想爲所有其他進程共享數據創建共享內存池,但在閱讀了有關CreateFileMapping API文檔之後,我很困惑它需要指定共享內存的大小。我真的希望它是動態分配和免費的,看起來更像一個服務。有沒有辦法使用createFileMapping或者不使用共享內存動態?如何在Windows中創建共享內存池

+2

如果升壓是提供給您,使用Boost.Interprocess中。 – GManNickG 2011-12-27 06:19:42

+0

它肯定是一個選項〜 – 2011-12-27 07:11:20

+0

SEC_RESERVE選項應該允許您保留地址空間而不需要提交地址空間,但是從API看來您希望能夠釋放它。 – marcinj 2011-12-27 10:46:53

回答

0

創建命名的共享內存。

第一過程

第一處理通過調用CreateFileMapping函數INVALID_HANDLE_VALUE和該對象的名稱創建文件映射對象。通過使用PAGE_READWRITE標誌,該進程通過創建的任何文件視圖具有對內存的讀/寫權限。 然後該進程使用CreateFileMapping在調用MapViewOfFile時返回的文件映射對象句柄在進程地址空間中創建該文件的視圖。 MapViewOfFile函數返回一個指向文件視圖的指針pBuf。該過程然後使用CopyMemory函數將字符串寫入可由其他進程訪問的視圖。

過程1個代碼:

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <tchar.h> 

#define BUF_SIZE 256 
TCHAR szName[]=TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[]=TEXT("Message from first process."); 

int _tmain() 
{ 
    HANDLE hMapFile; 
    LPCTSTR pBuf; 

    hMapFile = CreateFileMapping(
       INVALID_HANDLE_VALUE, // use paging file 
       NULL,     // default security 
       PAGE_READWRITE,   // read/write access 
       0,      // maximum object size (high-order DWORD) 
       BUF_SIZE,    // maximum object size (low-order DWORD) 
       szName);     // name of mapping object 

    if (hMapFile == NULL) 
    { 
     _tprintf(TEXT("Could not create file mapping object (%d).\n"), 
      GetLastError()); 
     return 1; 
    } 
    pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object 
         FILE_MAP_ALL_ACCESS, // read/write permission 
         0, 
         0, 
         BUF_SIZE); 

    if (pBuf == NULL) 
    { 
     _tprintf(TEXT("Could not map view of file (%d).\n"), 
      GetLastError()); 

     CloseHandle(hMapFile); 

     return 1; 
    } 


    CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 
    _getch(); 

    UnmapViewOfFile(pBuf); 

    CloseHandle(hMapFile); 

    return 0; 
} 

第二工序

的第二種方法可以通過調用OpenFileMapping函數指定爲相同的名稱訪問由所述第一過程寫入到共享存儲器的串映射對象作爲第一個進程。然後它可以使用MapViewOfFile函數獲取指向文件視圖的指針pBuf。該過程可以像顯示任何其他字符串一樣顯示該字符串。在此示例中,顯示的消息框包含第一個進程寫入的消息「來自第一個進程的消息」。

工藝2代碼:

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <tchar.h> 
#pragma comment(lib, "user32.lib") 

#define BUF_SIZE 256 
TCHAR szName[]=TEXT("Global\\MyFileMappingObject"); 

int _tmain() 
{ 
    HANDLE hMapFile; 
    LPCTSTR pBuf; 

    hMapFile = OpenFileMapping(
        FILE_MAP_ALL_ACCESS, // read/write access 
        FALSE,     // do not inherit the name 
        szName);    // name of mapping object 

    if (hMapFile == NULL) 
    { 
     _tprintf(TEXT("Could not open file mapping object (%d).\n"), 
      GetLastError()); 
     return 1; 
    } 

    pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object 
       FILE_MAP_ALL_ACCESS, // read/write permission 
       0, 
       0, 
       BUF_SIZE); 

    if (pBuf == NULL) 
    { 
     _tprintf(TEXT("Could not map view of file (%d).\n"), 
      GetLastError()); 

     CloseHandle(hMapFile); 

     return 1; 
    } 

    MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK); 

    UnmapViewOfFile(pBuf); 

    CloseHandle(hMapFile); 

    return 0; 
} 

來源:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx