我想爲所有其他進程共享數據創建共享內存池,但在閱讀了有關CreateFileMapping API文檔之後,我很困惑它需要指定共享內存的大小。我真的希望它是動態分配和免費的,看起來更像一個服務。有沒有辦法使用createFileMapping或者不使用共享內存動態?如何在Windows中創建共享內存池
0
A
回答
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
相關問題
- 1. 確定哪個進程在Windows中創建共享內存
- 2. 如何在C中的共享內存中創建信號燈?
- 3. 如何在共享內存段中創建apr_table_t類型的表?
- 4. Win CE:創建命名共享內存
- 5. 創建共享內存時出錯
- 6. 如何在fork或子進程之後創建共享內存?
- 7. 如何創建共享磁頭內存exe和dll /共享對象
- 8. 共享內存中的STL容器(Windows)
- 9. 如何在Windows中實現共享內存?
- 10. 如何在Windows中使用共享內存
- 11. 如何在共享內存中得到共享對象
- 12. C++共享內存泄漏,如何清除共享內存?
- 13. 在Windows上創建共享文件夾
- 14. 在共享內存
- 15. CreateFileMapping用於在win32中創建共享內存
- 16. 無法訪問在子進程中創建的共享內存
- 17. 在共享內存中創建隊列POSIX
- 18. 如何分享共享內存?
- 19. 不能創建共享內存鍵12345:文件存在
- 20. 在沒有共享內存的共享內存中創建像PyOpenCL一樣的模板
- 21. 內存共享
- 22. 如何在Bonita Studio中創建由不同池共享的任務?
- 23. 如何在Azure webfarm中創建分佈式共享事務內存?
- 24. 如何在託管共享內存段中創建同步機制?
- 25. 使用Windows共享內存共享小數據
- 26. 命名共享內存的Windows API C++
- 27. Windows:調整共享內存的大小
- 28. 將多進程池內循環(進程間共享內存)
- 29. iOS中的文件是否有共享的內存池?
- 30. 在內存中緩存數據共享
如果升壓是提供給您,使用Boost.Interprocess中。 – GManNickG 2011-12-27 06:19:42
它肯定是一個選項〜 – 2011-12-27 07:11:20
SEC_RESERVE選項應該允許您保留地址空間而不需要提交地址空間,但是從API看來您希望能夠釋放它。 – marcinj 2011-12-27 10:46:53