进程间通信_共享内存类_C++实现

来源:互联网 发布:命令启动mysql 编辑:程序博客网 时间:2024/05/17 01:00

参考这个:

http://www.codeproject.com/Articles/1547/Shared-memory

设置一个非常好用的内存共享类,目前实在VC6下开发的,所以如果要在高版本VC用,要简单修改一下循环中的变量;

这个类功能非常强大,而且也很好用,有示例工程,这里我简单写一个示例:

注意的地方:创建的共享内存大小,一定要大于写入的内存大小 + sizeof(DEWORD)以上的字节数;


#include "SharedMemory.h"


CSharedMemory * m_psm = NULL;


#define MEMORY_SIZE 10000


char * pstr = "abcdefghijklmnopqrstuvwxyz";


void Ctmfc1Dlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码


SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE);


SECURITY_ATTRIBUTES sa = { sizeof sa, &sd, FALSE };


m_psm = new CSharedMemory(_T("TestMemory"),MEMORY_SIZE);


// if ((m_psm) && (m_psm->IsCreated()) && (! m_psm->ExistValue(_T("Test")))) 
// {
// m_psm->AddDwordValue(_T("Test"),1);
// 


}




void Ctmfc1Dlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码


if ( (m_psm) && (m_psm->IsCreated()) )
{
m_psm->Write( (BYTE*)pstr, strlen(pstr) );
}


}


void Ctmfc1Dlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码


char strch[1000]={0};


if ( (m_psm) && (m_psm->IsCreated()) )
{
m_psm->Read( (BYTE*)strch, 100 );
}




MessageBox( CString(strch) ); 


}










转一些其他的文章,作为参考;

头文件:

[cpp:nogutter] view plaincopyprint?
  1. /******************************************************************
  2. ++  File Name :   FFMClass.h
  3. ++  Description: 共享內存類
  4. ---------------------------------------------------------------
  5. ++  Author:  Fei ZhaoDong
  6. ++  Create time: 2004/3/25 上午 10:00:00
  7. ++  Version:     1.1
  8. ++  Modifier: 
  9. ++  Activities:   
  10. ++  Update List: 2004/3/30 下午 02:59:45
  11. *******************************************************************/ 
  12. // FFMClass.h: interface for the CFFMClass. 
  13. // 
  14. ////////////////////////////////////////////////////////////////////// 
  15. #ifndef FZD_FFMCLASS_H 
  16. #define FZD_FFMCLASS_H 
  17. //#include <Winbase.h> 
  18. #include <aclapi.h> 
  19.  
  20. ////////////////////////////////////////////////////////////////////// 
  21. // Macro definition 
  22. // 以下為共享內存定義 
  23. #define DEFAULT_FILENAME NULL    // 默認的文件名 
  24. #define DEFAULT_MAPNAME  "Local//_FZD_MAP_"   // 默認的共享內存名 
  25. #define DEFAULT_MAPSIZE  (0xFFFF + 1)  // 默認的共享內存大小 
  26. const DWORD NETRGUSER_CFM_CODE = 0x1211DBFF;// 校驗碼, 用於命令數據 
  27. const DWORD NETRGUSER_CMD_NONE = 0;  // 初始化指令碼, 無指令 
  28. // 以下為錯誤碼定義 
  29. #define ERROR_LEN    256    // 錯誤描述長度 
  30. #define ERROR_INVALID_CMDCODE 0xE00001FF  // 已經存在完全一樣的共享內存 
  31. #define ERROR_NO_MAPFILE             0xE00002FF  // 未分配共享內存文件 
  32. #define ERROR_INVALID_CFMCODE 0xE00003FF  // 校驗碼不匹配 
  33. ////////////////////////////////////////////////////////////////////// 
  34. // 內存文件格式定義 
  35. #pragma pack(1) 
  36. // 用於存儲命令數據的內存文件格式 
  37. typedef struct _tagDATA_HEADER 
  38.     DWORD dwConfirmCode;// 校驗碼 
  39.     DWORD nCommandCode;  // 指令識別碼 
  40.     DWORD dwDataSize; // 數據的大小 
  41.     BYTE  dwReserved[19]; // 保留 
  42.     BYTE  bInfo[1];   // 數據起始地址 
  43.     _tagDATA_HEADER() 
  44.     { 
  45.         dwConfirmCode = NETRGUSER_CFM_CODE; 
  46.         nCommandCode = NETRGUSER_CMD_NONE; 
  47.         dwDataSize = 0; 
  48.         ZeroMemory(dwReserved, 19); 
  49.         ZeroMemory(bInfo, 1); 
  50.     } 
  51. }DATA_HEADER, *LPDATA_HEADER; 
  52. typedef DWORD (WINAPI *PSetEntriesInAcl)(ULONG, PEXPLICIT_ACCESS, PACL, PACL*); 
  53. // 用於存儲應答數據的共享內存文件格式 (暫不用) 
  54. typedef struct _tagANS_HEADER 
  55. }ANS_HEADER, *LPANS_HEADER; 
  56.  
  57. #pragma pack() 
  58.  
  59. ////////////////////////////////////////////////////////////////////// 
  60. // 類定義,共享內存服務端 
  61. class CFFMServer   
  62. public
  63.     CFFMServer(); 
  64.     virtual ~CFFMServer(); 
  65.     CFFMServer(char *szFileName, char *szMapName, DWORD dwSize); 
  66. protected
  67.     PSetEntriesInAcl m_fnpSetEntriesInAcl; 
  68.     HANDLE m_hFile;   // 映射文件句柄 
  69.     HANDLE m_hFileMap;   // 內存文件句柄 
  70.     LPVOID m_lpFileMapBuffer;// 緩衝區指針 
  71.     char *m_pFileName;  // 映射文件名 
  72.     char *m_pMapName; // 內存文件名 
  73.     DWORD m_dwSize;   // 緩衝區大小 
  74.     BOOL m_bCreateFlag; // 是否已創建共享內存 
  75.     DWORD   m_dwLastError;  // 錯誤代碼 
  76. private
  77.     void _Init();    // 初始化參數 
  78.     BOOL _IsWinNTLater(); // 判斷當前操作系統 
  79. public
  80.     BOOL Create(char *szFileName = DEFAULT_FILENAME, 
  81.         char *szMapName = DEFAULT_MAPNAME, 
  82.         DWORD dwSize = DEFAULT_MAPSIZE);// 新建共享內存 
  83.     LPVOID GetBuffer();      // 獲取內存文件指針 
  84.     DWORD GetSize();     // 獲取內存文件大小 
  85.     void Destory();       // 銷毀已有的共享內存 
  86.     BOOL WriteCmdData(     // 寫入命令數據 
  87.         DWORD nCommandCode, 
  88.         DWORD dwDataSize, 
  89.         const LPVOID pBuf); 
  90. }; 
  91. ////////////////////////////////////////////////////////////////////// 
  92. // 類定義,共享內存客戶端 
  93. class CFFMClient   
  94. public
  95.     CFFMClient(); 
  96.     virtual ~CFFMClient(); 
  97.     CFFMClient(DWORD dwAccess,char *szMapName,DWORD dwSize); 
  98. protected
  99.     HANDLE m_hFileMap;  // 內存文件句柄 
  100.     LPVOID m_lpFileMapBuffer; // 內存文件指針 
  101.     char *m_pMapName; // 內存文件名 
  102.     DWORD m_dwSize;   // 緩衝區大小 
  103.     BOOL m_bOpenFlag; // 是否已經打開了一個內存文件 
  104.     DWORD   m_dwLastError;  // 錯誤代碼 
  105. private
  106.     void _Init();    // 初始化參數 
  107. public
  108.     BOOL Open(DWORD dwAccess = FILE_MAP_READ | FILE_MAP_WRITE, 
  109.         char *szMapName = DEFAULT_MAPNAME, 
  110.         DWORD dwSize = 0);      // 打開一個內存文件 
  111.     LPVOID GetBuffer();      // 獲取當前內存文件的指針 
  112.     void Destory();        // 關閉當前對內存文件的訪問 
  113.     DWORD GetSize();     // 獲取內存文件大小 
  114.     BOOL GetCmdDataSize(DWORD *pDataSize); // 讀取命令數據大小 
  115.     BOOL ReadCmdData(      // 讀取命令數據 
  116.         DWORD dwCommandCode, 
  117.         DWORD dwBufSize, 
  118.         LPVOID pOutBuf); 
  119.     BOOL WriteCmdData(     // 寫入命令數據 
  120.         DWORD memSize,  
  121.         DWORD nCommandCode, 
  122.         DWORD dwDataSize, 
  123.         const LPVOID pBuf); 
  124. }; 
  125. #endif // FZD_FFMCLASS_H 

实现文件:

[cpp:nogutter] view plaincopyprint?
  1. /******************************************************************
  2. ++  File Name : FFMClass.cpp
  3. ++  Description: 共享內存類
  4. ---------------------------------------------------------------
  5. ++  Author:  Fei ZhaoDong
  6. ++  Create time: 2004/3/25 上午 10:00:00
  7. ++  Version:     1.0
  8. ++  Modifier: 
  9. ++   Activities:   
  10. ++  Update List: 2004/3/29 下午 02:59:45
  11. *******************************************************************/ 
  12. // FFMClass.cpp: implementation of the CFFMClass. 
  13. // 
  14. ////////////////////////////////////////////////////////////////////// 
  15. #include "stdafx.h" 
  16. #include "FFMClass.h" 
  17. //#include <aclapi.h> 
  18. //#include <windows.h> 
  19. //#include <aclapi.h> 
  20. //#include <lmerr.h> 
  21. // 
  22. //#include <stdio.h> 
  23. ////////////////////////////////////////////////////////////////////// 
  24. // CFFMServer 
  25. ////////////////////////////////////////////////////////////////////// 
  26. CFFMServer::CFFMServer() 
  27.     m_dwLastError = 0; 
  28.     m_fnpSetEntriesInAcl = NULL; 
  29.     _Init(); 
  30. CFFMServer::~CFFMServer() 
  31.     Destory(); 
  32. CFFMServer::CFFMServer(char *szFileName,char *szMapName,DWORD dwSize) 
  33.     // 以自定義設置創建共享內存塊 
  34.     _Init(); 
  35.     Create(szFileName, szMapName, dwSize); 
  36. // 初始化各個參數 
  37. void CFFMServer::_Init() 
  38.     m_hFile = NULL; 
  39.     m_hFileMap = NULL; 
  40.     m_lpFileMapBuffer = NULL; 
  41.     m_pFileName = NULL; 
  42.     m_pMapName = NULL; 
  43.     m_dwSize = 0; 
  44.     m_bCreateFlag = FALSE; 
  45. // 判斷是否NT4.0以上操作系統 
  46. BOOL CFFMServer::_IsWinNTLater() 
  47.     OSVERSIONINFO Ver; 
  48.     BOOL bAbleVersion = FALSE; 
  49.     Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
  50.     if (GetVersionEx(&Ver)) 
  51.     { 
  52.         if (Ver.dwPlatformId == VER_PLATFORM_WIN32_NT 
  53.             && Ver.dwMajorVersion >= 4) 
  54.         { 
  55.             bAbleVersion = TRUE; 
  56.         } 
  57.     } 
  58.     else 
  59.     { 
  60.         m_dwLastError = GetLastError(); 
  61.     } 
  62.     return bAbleVersion; 
  63. // 釋放當前共享內存,並重新初始化參數 
  64. void CFFMServer::Destory() 
  65.     if (m_lpFileMapBuffer != NULL) 
  66.     { 
  67.         UnmapViewOfFile(m_lpFileMapBuffer); 
  68.         m_lpFileMapBuffer = NULL; 
  69.     } 
  70.     if (m_hFileMap != NULL) 
  71.     { 
  72.         CloseHandle(m_hFileMap); 
  73.         m_hFileMap = NULL; 
  74.     } 
  75.     if (m_hFile && m_hFile != INVALID_HANDLE_VALUE) 
  76.     { 
  77.         CloseHandle(m_hFile); 
  78.         m_hFile = NULL; 
  79.     } 
  80.     if (m_pFileName != NULL) 
  81.     { 
  82.         free(m_pFileName); 
  83.         m_pFileName = NULL; 
  84.     } 
  85.     if (m_pMapName != NULL) 
  86.     { 
  87.         free(m_pMapName); 
  88.         m_pMapName = NULL; 
  89.     } 
  90.     _Init(); 
  91. static void FreeSidEx(PSID oSID) 
  92.     try 
  93.     { 
  94.         FreeSid(oSID); 
  95.     } 
  96.     catch(...) 
  97.     { 
  98.     } 
  99. // 創建共享內存塊 
  100. BOOL CFFMServer::Create(char *szFileName,char *szMapName,DWORD dwSize) 
  101.     // 釋放已有的共享內存塊 
  102.     if (m_bCreateFlag) 
  103.     { 
  104.         Destory(); 
  105.     } 
  106.     // 拷貝各個參數 
  107.     if (szFileName) 
  108.     { 
  109.         m_pFileName = _strdup(szFileName); 
  110.     } 
  111.     if (szMapName) 
  112.     { 
  113.         m_pMapName = _strdup(szMapName); 
  114.     } 
  115.     else 
  116.     { 
  117.         m_pMapName = _strdup(DEFAULT_MAPNAME); 
  118.     } 
  119.     if (dwSize > 0) 
  120.     { 
  121.         m_dwSize = dwSize; 
  122.     } 
  123.     else 
  124.     { 
  125.         m_dwSize = DEFAULT_MAPSIZE; 
  126.     } 
  127.     // 以下創建共享內存 
  128.     if (m_pFileName) 
  129.     { 
  130.         m_hFile = CreateFile( 
  131.             m_pFileName, 
  132.             GENERIC_READ|GENERIC_WRITE, 
  133.             FILE_SHARE_READ|FILE_SHARE_WRITE, 
  134.             NULL, 
  135.             OPEN_ALWAYS, 
  136.             FILE_ATTRIBUTE_NORMAL, 
  137.             NULL 
  138.             ); 
  139.     } 
  140.     else 
  141.     { 
  142.         // 默認情況下,在頁面文件中創建共享內存 
  143.         m_hFile = INVALID_HANDLE_VALUE; 
  144.     } 
  145.     if (_IsWinNTLater()) 
  146.     { 
  147.         // Set DACL 
  148.         const int NUM_ACES = 2;  // number if ACEs int DACL 
  149.         // evryone -- read 
  150.         // creator -- full access 
  151.         // 初始化參數 
  152.         PSID pEveryoneSID        = NULL; // everyone群組SID 
  153.         PSID pCreatorSID   = NULL; // creator群組SID 
  154.         PACL pFileMapACL         = NULL; // 準備新內存文件的DACL 
  155.         PSECURITY_DESCRIPTOR  pSD = NULL; // 內存文件的SD 
  156.         SECURITY_ATTRIBUTES   saFileMap; // 內存文件的SA 
  157.         EXPLICIT_ACCESS    ea[NUM_ACES]; // 外部訪問結構 
  158.         BOOL bHasErr   = FALSE;// 返回值 
  159.         // 以下創建SID 
  160.         SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; 
  161.         SID_IDENTIFIER_AUTHORITY SIDAuthCreator = SECURITY_CREATOR_SID_AUTHORITY; 
  162.         // Evryone 
  163.         if (!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 
  164.             0, 0, 0, 0, 0, 0, 0, &pEveryoneSID)) 
  165.         { 
  166.             bHasErr = TRUE; 
  167.             goto Finish; 
  168.         } 
  169.         // Creator 
  170.         if (!AllocateAndInitializeSid(&SIDAuthCreator, 1, SECURITY_CREATOR_OWNER_RID, 
  171.             0, 0, 0, 0, 0, 0, 0, &pCreatorSID)) 
  172.         { 
  173.             bHasErr = TRUE; 
  174.             goto Finish; 
  175.         } 
  176.         // 填充ACE 
  177.         ZeroMemory(&ea, NUM_ACES * sizeof(EXPLICIT_ACCESS)); 
  178.         // S-1-1-0 evryone, 唯讀權限 
  179.         ea[0].grfAccessPermissions = GENERIC_READ | GENERIC_WRITE; 
  180.         ea[0].grfAccessMode = SET_ACCESS; 
  181.         ea[0].grfInheritance= NO_INHERITANCE; 
  182.         ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID; 
  183.         ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 
  184.         ea[0].Trustee.ptstrName  = (LPTSTR) pEveryoneSID; 
  185.         // S-1-3-0 creator owner, 完全權限 
  186.         ea[1].grfAccessPermissions = STANDARD_RIGHTS_ALL; 
  187.         ea[1].grfAccessMode = SET_ACCESS; 
  188.         ea[1].grfInheritance= NO_INHERITANCE; 
  189.         ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID; 
  190.         ea[1].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 
  191.         ea[1].Trustee.ptstrName  = (LPTSTR) pCreatorSID; 
  192.         // 創建並填充ACL 
  193.         if(NULL == m_fnpSetEntriesInAcl) 
  194.         { 
  195.             HINSTANCE hLib = ::LoadLibrary("Advapi32.dll"); 
  196.             if(NULL != hLib) 
  197.             { 
  198.                 m_fnpSetEntriesInAcl = (PSetEntriesInAcl)GetProcAddress(hLib,"SetEntriesInAclA"); 
  199.                 ::FreeLibrary(hLib); 
  200.                 hLib = NULL; 
  201.             } 
  202.         } 
  203.         if (ERROR_SUCCESS != m_fnpSetEntriesInAcl(NUM_ACES, ea, NULL, &pFileMapACL)) 
  204.         { 
  205.             bHasErr = TRUE; 
  206.             goto Finish; 
  207.         } 
  208.         // 創建並初始化SD 
  209.         pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);  
  210.         if (NULL == pSD) 
  211.         { 
  212.             bHasErr = TRUE; 
  213.             goto Finish; 
  214.         }  
  215.         if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))  
  216.         { 
  217.             bHasErr = TRUE; 
  218.             goto Finish; 
  219.         } 
  220.         // 添加ACL到SD中去 
  221.         if (!SetSecurityDescriptorDacl(pSD, 
  222.             TRUE,     // fDaclPresent flag   
  223.             pFileMapACL,  
  224.             FALSE))   // not a default DACL 
  225.         { 
  226.             bHasErr = TRUE; 
  227.             goto Finish; 
  228.         } 
  229.         // 設置SA 
  230.         saFileMap.nLength = sizeof(SECURITY_ATTRIBUTES); 
  231.         saFileMap.bInheritHandle = FALSE; 
  232.         saFileMap.lpSecurityDescriptor = pSD; 
  233.         // 創建共享內存文件 
  234.         if (m_hFile != NULL) 
  235.         { 
  236.             m_hFileMap = CreateFileMapping( 
  237.                 m_hFile, 
  238.                 &saFileMap, 
  239.                 PAGE_READWRITE, 
  240.                 0, 
  241.                 m_dwSize, 
  242.                 m_pMapName); 
  243.             if (NULL == m_hFileMap) 
  244.             { 
  245.                 m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, 
  246.                     TRUE, m_pMapName); 
  247.                 if (NULL == m_hFileMap) 
  248.                 { 
  249.                     m_dwLastError = GetLastError();  
  250.                     Destory(); 
  251.                     goto Finish; 
  252.                 } 
  253.             } 
  254.         } 
  255. Finish: 
  256.         //if (pSD != NULL) 
  257.         //{ 
  258.         //  LocalFree(pSD); 
  259.         //}      
  260.         pSD = NULL; 
  261.         if (pFileMapACL != NULL) 
  262.         { 
  263.             LocalFree(pFileMapACL); 
  264.             pFileMapACL = NULL; 
  265.         } 
  266.         if (pEveryoneSID != NULL) 
  267.         { 
  268.             FreeSidEx(pEveryoneSID); 
  269.             pEveryoneSID = NULL; 
  270.         } 
  271.         if (pCreatorSID != NULL) 
  272.         { 
  273.             FreeSidEx(pCreatorSID); 
  274.             pCreatorSID = NULL; 
  275.         } 
  276.         if (bHasErr)  
  277.         { 
  278.             m_dwLastError = GetLastError(); 
  279.             return FALSE; 
  280.         } 
  281.     } 
  282.     else 
  283.     { 
  284.         // 創建共享內存文件 
  285.         if (m_hFile) 
  286.         { 
  287.             m_hFileMap = CreateFileMapping( 
  288.                 m_hFile, 
  289.                 NULL, 
  290.                 PAGE_READWRITE, 
  291.                 0, 
  292.                 m_dwSize, 
  293.                 m_pMapName); 
  294.             if (NULL == m_hFileMap) 
  295.             { 
  296.                 m_dwLastError = GetLastError(); 
  297.                 Destory(); 
  298.                 return FALSE; 
  299.             } 
  300.         } 
  301.     } 
  302.     // 映射文件指針到用戶 
  303.     if (m_hFileMap) 
  304.     { 
  305.         m_lpFileMapBuffer = MapViewOfFile( 
  306.             m_hFileMap, 
  307.             FILE_MAP_ALL_ACCESS, 
  308.             0, 
  309.             0, 
  310.             m_dwSize); 
  311.         if (NULL == m_lpFileMapBuffer) 
  312.         { 
  313.             m_dwLastError = GetLastError(); 
  314.             Destory(); 
  315.             return FALSE; 
  316.         } 
  317.     } 
  318.     m_bCreateFlag = TRUE; 
  319.     return TRUE; 
  320. // 獲取內存文件指針 
  321. LPVOID CFFMServer::GetBuffer() 
  322.     return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL); 
  323. // 獲取內存文件大小 
  324. DWORD CFFMServer::GetSize() 
  325.     return m_dwSize; 
  326. BOOL CFFMServer::WriteCmdData(DWORD nCommandCode,DWORD dwDataSize,constLPVOID pBuf) 
  327.     // 檢驗數據的合理性 
  328.     if (NULL == GetBuffer()) 
  329.     { 
  330.         m_dwLastError = ERROR_NO_MAPFILE; 
  331.         SetLastError(ERROR_NO_MAPFILE); 
  332.         return FALSE; 
  333.     } 
  334.     if (NETRGUSER_CMD_NONE == nCommandCode) 
  335.     { 
  336.         m_dwLastError = ERROR_INVALID_CMDCODE; 
  337.         SetLastError(ERROR_INVALID_CMDCODE); 
  338.         return FALSE; 
  339.     } 
  340.     if (dwDataSize > 0 && pBuf == NULL) 
  341.     { 
  342.         m_dwLastError = ERROR_INVALID_USER_BUFFER; 
  343.         SetLastError(ERROR_INVALID_USER_BUFFER); 
  344.         return FALSE; 
  345.     } 
  346.     if (dwDataSize + sizeof(DATA_HEADER) > GetSize()) 
  347.     { 
  348.         m_dwLastError = ERROR_BUFFER_OVERFLOW; 
  349.         SetLastError(ERROR_BUFFER_OVERFLOW); 
  350.         return FALSE; 
  351.     } 
  352.     // 填寫數據結構 
  353.     // 文件頭 
  354.     DATA_HEADER dataHeader; 
  355.     dataHeader.nCommandCode = nCommandCode; 
  356.     dataHeader.dwDataSize = dwDataSize; 
  357.     ZeroMemory(GetBuffer(), GetSize()); 
  358.     memcpy(GetBuffer(), &dataHeader, sizeof(DATA_HEADER)); 
  359.     // 數據塊 
  360.     LPDATA_HEADER pData = (LPDATA_HEADER)GetBuffer(); 
  361.     memcpy(pData->bInfo, pBuf, dwDataSize); 
  362.     return TRUE; 
  363. ////////////////////////////////////////////////////////////////////// 
  364. // CFFMClient 
  365. ////////////////////////////////////////////////////////////////////// 
  366. CFFMClient::CFFMClient() 
  367.     m_dwLastError = 0; 
  368.     _Init(); 
  369. CFFMClient::~CFFMClient() 
  370.     Destory(); 
  371. CFFMClient::CFFMClient(DWORD dwAccess,char *szMapName,DWORD dwSize) 
  372.     _Init(); 
  373.     if (!Open(dwAccess, szMapName, dwSize)) 
  374.     { 
  375.         Destory(); 
  376.     } 
  377. // 初始化參數 
  378. void CFFMClient::_Init() 
  379.     m_hFileMap = NULL; 
  380.     m_lpFileMapBuffer = NULL; 
  381.     m_pMapName = NULL; 
  382.     m_bOpenFlag = FALSE; 
  383. // 關閉當前對內存文件的訪問 
  384. void CFFMClient::Destory() 
  385.     if (m_lpFileMapBuffer) 
  386.     { 
  387.         UnmapViewOfFile(m_lpFileMapBuffer); 
  388.         m_lpFileMapBuffer = NULL; 
  389.     } 
  390.     if (m_hFileMap) 
  391.     { 
  392.         CloseHandle(m_hFileMap); 
  393.         m_hFileMap = NULL; 
  394.     } 
  395.     if (m_pMapName) 
  396.     { 
  397.         free(m_pMapName); 
  398.         m_pMapName = NULL; 
  399.     } 
  400.     _Init(); 
  401. // 打開一個內存文件 
  402. BOOL CFFMClient::Open(DWORD dwAccess,char *szMapName,DWORD dwSize) 
  403.     if (m_bOpenFlag) 
  404.     { 
  405.         Destory(); 
  406.     } 
  407.     if (szMapName != NULL) 
  408.     { 
  409.         m_pMapName = _strdup(szMapName); 
  410.     } 
  411.     else 
  412.     { 
  413.         m_pMapName = _strdup(DEFAULT_MAPNAME); 
  414.     } 
  415.     m_hFileMap = OpenFileMapping(dwAccess, TRUE, m_pMapName); 
  416.     if (NULL == m_hFileMap) 
  417.     { 
  418.         m_dwLastError = GetLastError(); 
  419.         Destory(); 
  420.         return FALSE; 
  421.     } 
  422.     m_lpFileMapBuffer = MapViewOfFile(m_hFileMap, dwAccess, 0, 0, dwSize); 
  423.     if (NULL == m_lpFileMapBuffer) 
  424.     { 
  425.         m_dwLastError = GetLastError(); 
  426.         Destory(); 
  427.         return FALSE; 
  428.     } 
  429.     m_bOpenFlag = TRUE; 
  430.     return TRUE; 
  431. // 獲取當前內存文件的指針 
  432. LPVOID CFFMClient::GetBuffer() 
  433.     return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL); 
  434. // 讀取命令數據大小 
  435. BOOL CFFMClient::GetCmdDataSize(DWORD *pDataSize) 
  436.     _ASSERT(pDataSize != NULL); 
  437.     *pDataSize = 0; 
  438.     LPDATA_HEADER pHeader = (LPDATA_HEADER)GetBuffer(); 
  439.     if (NULL == pHeader) 
  440.     { 
  441.         m_dwLastError = ERROR_NO_MAPFILE; 
  442.         SetLastError(ERROR_NO_MAPFILE); 
  443.         return FALSE; 
  444.     } 
  445.     if (NETRGUSER_CFM_CODE != pHeader->dwConfirmCode) 
  446.     { 
  447.         m_dwLastError = ERROR_INVALID_CFMCODE; 
  448.         SetLastError(ERROR_INVALID_CFMCODE); 
  449.         return FALSE; 
  450.     } 
  451.     if (NETRGUSER_CMD_NONE == pHeader->nCommandCode) 
  452.     { 
  453.         m_dwLastError = ERROR_INVALID_CMDCODE; 
  454.         SetLastError(ERROR_INVALID_CMDCODE); 
  455.         return FALSE; 
  456.     } 
  457.     *pDataSize = pHeader->dwDataSize; 
  458.     return TRUE; 
  459. // 讀取命令數據 
  460. BOOL CFFMClient::ReadCmdData(DWORD dwCommandCode,DWORD dwBufSize,LPVOID pOutBuf) 
  461.     _ASSERT (pOutBuf != NULL); 
  462.     LPDATA_HEADER pHeader = (LPDATA_HEADER)GetBuffer(); 
  463.     if (NULL == pHeader) 
  464.     { 
  465.         m_dwLastError = ERROR_NO_MAPFILE; 
  466.         SetLastError(ERROR_NO_MAPFILE); 
  467.         return FALSE; 
  468.     } 
  469.     if (NETRGUSER_CFM_CODE != pHeader->dwConfirmCode) 
  470.     { 
  471.         m_dwLastError = ERROR_INVALID_CFMCODE; 
  472.         SetLastError(ERROR_INVALID_CFMCODE); 
  473.         return FALSE; 
  474.     } 
  475.     if (NETRGUSER_CMD_NONE == pHeader->nCommandCode) 
  476.     { 
  477.         m_dwLastError = ERROR_INVALID_CMDCODE; 
  478.         SetLastError(ERROR_INVALID_CMDCODE); 
  479.         return FALSE; 
  480.     } 
  481.     if (pHeader->dwDataSize > dwBufSize) 
  482.     { 
  483.         m_dwLastError = ERROR_BUFFER_OVERFLOW; 
  484.         SetLastError(ERROR_BUFFER_OVERFLOW); 
  485.         return FALSE; 
  486.     } 
  487.     if (pHeader->nCommandCode != dwCommandCode) 
  488.     { 
  489.         m_dwLastError = ERROR_INVALID_CMDCODE; 
  490.         SetLastError(ERROR_INVALID_CMDCODE); 
  491.         return FALSE; 
  492.     } 
  493.     ZeroMemory(pOutBuf, dwBufSize); 
  494.     // 拷貝數據到緩衝區 
  495.     memcpy(pOutBuf, pHeader->bInfo, pHeader->dwDataSize); 
  496.     return TRUE; 
  497. BOOL CFFMClient::WriteCmdData(DWORD memSize,DWORD nCommandCode,DWORD dwDataSize,constLPVOID pBuf) 
  498.     if(!memSize) 
  499.         memSize = DEFAULT_MAPSIZE;   
  500.     m_dwSize = memSize; 
  501.     // 檢驗數據的合理性 
  502.     if (NULL == GetBuffer()) 
  503.     { 
  504.         m_dwLastError = ERROR_NO_MAPFILE; 
  505.         SetLastError(ERROR_NO_MAPFILE); 
  506.         return FALSE; 
  507.     } 
  508.     if (NETRGUSER_CMD_NONE == nCommandCode) 
  509.     { 
  510.         m_dwLastError = ERROR_INVALID_CMDCODE; 
  511.         SetLastError(ERROR_INVALID_CMDCODE); 
  512.         return FALSE; 
  513.     } 
  514.     if (dwDataSize > 0 && pBuf == NULL) 
  515.     { 
  516.         m_dwLastError = ERROR_INVALID_USER_BUFFER; 
  517.         SetLastError(ERROR_INVALID_USER_BUFFER); 
  518.         return FALSE; 
  519.     } 
  520.     if (dwDataSize + sizeof(DATA_HEADER) > GetSize()) 
  521.     { 
  522.         m_dwLastError = ERROR_BUFFER_OVERFLOW; 
  523.         SetLastError(ERROR_BUFFER_OVERFLOW); 
  524.         return FALSE; 
  525.     } 
  526.     // 填寫數據結構 
  527.     // 文件頭 
  528.     DATA_HEADER dataHeader; 
  529.     dataHeader.nCommandCode = nCommandCode; 
  530.     dataHeader.dwDataSize = dwDataSize; 
  531.     ZeroMemory(GetBuffer(), GetSize()); 
  532.     memcpy(GetBuffer(), &dataHeader, sizeof(DATA_HEADER)); 
  533.     // 數據塊 
  534.     LPDATA_HEADER pData = (LPDATA_HEADER)GetBuffer(); 
  535.     memcpy(pData->bInfo, pBuf, dwDataSize); 
  536.     return TRUE; 
  537. // 獲取內存文件大小 
  538. DWORD CFFMClient::GetSize() 
  539.     return m_dwSize; 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////一个简单类


#ifndef _CSHAREMEMORY
#define _CSHRREMEMORY
class CShareMemory
{
public:
 CShareMemory();
 ~CShareMemory();
 bool CreateShareMemory(DWORD MemorySize,char *ShareMemoryName);  //创建共享内存
    bool OpenShareMemory(char *ShareMemoryName); //打开一个现有的共享内存
 void CloseShare();  //关闭释放共享内存

public:
 HANDLE m_filemapp;  //文件映射
 char *m_shareAddress; //共享内存起始地址
};

#endif


#include"StdAfx.h"
#include"CShareMemory.h"

CShareMemory::CShareMemory()
{
 m_filemapp=NULL;
 m_shareAddress=NULL;
}
CShareMemory::~CShareMemory()
{
 CloseShare();
}

 


////////////////////////////////////////////////////////////////////////////////////////////////////////
//DWORD MemorySizy  共享内存大小;
//      char *ShareMemeoryName 共享内存名称
////////////////////////////////////////////////////////////////////////////////////////////////////////

bool CShareMemory::CreateShareMemory(DWORD MemorySize,char *ShareMemoryName)
{
    //创建文件映射对象;
 HANDLE sh=CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,MemorySize,ShareMemoryName);

 //将文件映射对象映射到当前应用程序的地址空间;
 m_shareAddress=(char *)MapViewOfFile(sh,FILE_MAP_ALL_ACCESS,0,0,0);
 if(sh==NULL)
  return false;

 //若创建的共享内存命名空间 与现有的内存映射,互斥量,信号量,临界区 同名,则返回失败;
 if(GetLastError()==ERROR_INVALID_HANDLE)
 {
  CloseShare();
  return false;
 }

 //若创建的共享内存为创建,则创建新的共享内存,清空共享内存空间;
 if(GetLastError()!=ERROR_ALREADY_EXISTS)
   ZeroMemory(m_shareAddress,MemorySize); 
 

 m_filemapp=sh;
 return true;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//CShareMemory::OpenShareMemory 打开现有的共享内存
//ÐβΣºchar *ShareMemeoryName 共享内存名称
////////////////////////////////////////////////////////////////////////////////////////////////////////
bool CShareMemory::OpenShareMemory(char *ShareMemoryName)
{

 //打开现有的共享内存
 HANDLE sh=OpenFileMapping(FILE_MAP_ALL_ACCESS,false,ShareMemoryName);
 m_shareAddress=(char *)MapViewOfFile(sh,FILE_MAP_ALL_ACCESS,0,0,0);
 if(sh==NULL)
 { 
  return false;
 }
 m_filemapp=sh;
 return true;
 
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//CShareMemory::CloseShare() 关闭释放共享内存
////////////////////////////////////////////////////////////////////////////////////////////////////////
void CShareMemory::CloseShare()
{
 UnmapViewOfFile(m_shareAddress);
 CloseHandle(m_filemapp);
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////另一篇,简单参考

 

// 2002/07/05
// awzzz
// SFMMem.h: interface for the CSFMServer class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SFMSERVER_H__2D76A439_6388_4B07_AE7A_C82F458642ED__INCLUDED_)
#define AFX_SFMSERVER_H__2D76A439_6388_4B07_AE7A_C82F458642ED__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define DEFAULT_FILENAME    NULL
#define DEFAULT_MAPNAME     "TestShareMemory"
#define DEFAULT_MAPSIZE     (0x0FFF + 1)
// Shared FileMap Server
// 使用说明
// 1.
// 创建CSFMServer对象
// CSFMServer(char *szFileName, char *szMapName, DWORD dwSize);
// Create(char *szFileName, char *szMapName, DWORD dwSize);
// 参数1:NULL或指定的文件(将创建或打开并读写/麻烦)
// 参数2:要创建的共享内存对象名
// 参数3:要创建的共享内存对象大小
// 2.
// 本地使用内存
// LPVOID GetBuffer()
// 返回共享内存地址
//
// 自动销毁
classCSFMServer 
    {
    public:
        CSFMServer();
        virtual~CSFMServer();
        CSFMServer(char*szFileName,char*szMapName,DWORDdwSize);
        HANDLE m_hMutex;
    protected:
        HANDLE m_hFile;
        HANDLE m_hFileMap;
        LPVOID m_lpFileMapBuffer;
        string  m_strMutexName;
        char   *m_pFileName;
        char   *m_pMapName;
        DWORD  m_dwSize;
        int    m_iCreateFlag;
    private:
        voidInit();
        voidDestory();
    public:
        voidCreate(char*szFileName,char*szMapName,DWORDdwSize);
        LPVOIDGetBuffer();
        DWORDGetSize();
    };
// Shared FileMap Client
// 使用说明
// 1.
// 创建CSFMClient对象
// CSFMClient(DWORD dwAccess, char *szMapName);
// Open(DWORD dwAccess, char *szMapName);
// 参数1:共享内存对象访问方式(FILE_MAP_READ|FILE_MAP_WRITE)
// 参数2:共享内存对象名
// 2.
// 本地使用内存
// LPVOID GetBuffer()
// 返回共享内存地址
//
// 自动销毁
classCSFMClient 
    {
    public:
        CSFMClient();
        virtual~CSFMClient();
        CSFMClient(DWORDdwAccess,char*szMapName,DWORDsize);
        HANDLE m_hMutex;
    protected:
        HANDLE m_hFileMap;
        LPVOID m_lpFileMapBuffer;     
        string  m_strMutexName;
        char   *m_pMapName;
        DWORD  m_dwSize;//共享缓冲区的大小
        int    m_iOpenFlag;
    private:
        voidInit();
        voidDestory();
    public:
        voidOpen(DWORDdwAccess,char*szMapName);
        LPVOIDGetBuffer();
        DWORD GetSize();
    };
#endif // !defined(AFX_SFMSERVER_H__2D76A439_6388_4B07_AE7A_C82F458642ED__INCLUDED_)
// SFMMem.cpp: implementation of the CSFMServer class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SFMMem.h"
#ifdef _DEBUG
#undef THIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////
// Construction/Destruction(服务器端,创建共享缓冲区,共享缓冲区读取写入数据)
/////////////////////////////////////////////////////////////////////////////
CSFMServer::CSFMServer()
    {
    Init();
    //创建共享缓冲区
    Create(DEFAULT_FILENAME, DEFAULT_MAPNAME, DEFAULT_MAPSIZE);
    }
CSFMServer::~CSFMServer()
    {
    Destory();
    }
CSFMServer::CSFMServer(char*szFileName,char*szMapName,DWORDdwSize)
    {
    Init();
    //创建共享缓冲区
    Create(szFileName, szMapName, dwSize);
    //Create(DEFAULT_FILENAME, DEFAULT_MAPNAME, DEFAULT_MAPSIZE);
    }
voidCSFMServer::Init()
    {
    m_hFile = NULL;
    m_hFileMap = NULL;
    m_lpFileMapBuffer = NULL;
    m_pFileName = NULL;
    m_pMapName = NULL;
    m_dwSize = 0;
    m_iCreateFlag = 0;
    }
voidCSFMServer::Destory()
    {
    if(m_lpFileMapBuffer)
        {
        if (!UnmapViewOfFile(m_lpFileMapBuffer))
            {
            printf("Server UnmapViewOfFile失败!rn");
            }      
        m_lpFileMapBuffer = NULL;
        }
    if(m_hFileMap)
        {
        if (!CloseHandle(m_hFileMap))
            {
            printf("Server CloseHandle  关闭映射文件句柄失败!rn");
            }
        m_hFileMap = NULL;
        }
    if(m_hFile && m_hFile != INVALID_HANDLE_VALUE)
        {
        if (!CloseHandle(m_hFile))
            {
            printf("Server CloseHandle 关闭互斥体句柄失败!rn");
            }      
        m_hFile = NULL;
        }
    if(m_pFileName)
        {
        free(m_pFileName);
        m_pFileName = NULL;
        }
    if(m_pMapName)
        {
        free(m_pMapName);
        m_pMapName = NULL;
        }
    Init();
    }
//创建共享缓冲区
voidCSFMServer::Create(char*szFileName,char*szMapName,DWORDdwSize)
    {
    if(m_iCreateFlag)
        {
        Destory();
        }
    if(szFileName)
        {
        m_pFileName = _strdup(szFileName);
        }
    else
        {
        m_pFileName = NULL;
        }
    if(szMapName)
        {
        m_pMapName = _strdup(szMapName);
        m_strMutexName=szMapName;
        m_strMutexName+="mutex";
        }
    else
        {
        m_pMapName = _strdup(DEFAULT_MAPNAME);
        m_strMutexName=DEFAULT_MAPNAME;
        m_strMutexName+="mutex";
        }
    if(dwSize > 0)
        {
        m_dwSize = dwSize;
        }
    else
        {
        m_dwSize = DEFAULT_MAPSIZE;
        }
    if(m_pFileName)
        {
        // file
        m_hFile = CreateFile(
            m_pFileName,
            GENERIC_READ|GENERIC_WRITE,
            FILE_SHARE_READ|FILE_SHARE_WRITE,
            NULL,
            OPEN_ALWAYS,//OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL
            );
        }
    else
        {
        // system
        m_hFile = (HANDLE)0xFFFFFFFF;
        }
    DWORDerror;
    //OutputDebugString((LPCSTR)m_hFile);
    //error=GetLastError();
    if(m_hFile)
        {
        m_hFileMap = CreateFileMapping(
            m_hFile,
            NULL,
            PAGE_READWRITE,
            0,
            m_dwSize,
            m_pMapName
            );
        //OutputDebugString((LPCSTR)m_hFile);
        //使只有一个CSFMServer对象能操作内存对象(郝兴峰修改)
        if (m_hFileMap != NULL)
            {
            error=GetLastError();
            if ( ERROR_ALREADY_EXISTS == error)//如果已经存在了,就不要创建操作了。
               {              
               m_hMutex=OpenMutex(SYNCHRONIZE,FALSE,m_strMutexName.c_str());
               }  
            else
               {
               m_hMutex=CreateMutex(NULL,FALSE,m_strMutexName.c_str());
               }      
            }
        else
            {
            printf("Server CreateFileMapping失败!rn");
            }
        }
    else
        {
        printf("Server CreateFile 失败!rn");
        }
    if(m_hFileMap)
        {
        m_lpFileMapBuffer = MapViewOfFile(
            m_hFileMap,
            FILE_MAP_ALL_ACCESS,//FILE_MAP_WRITE|FILE_MAP_READ,
            0,
            0,
            0//m_dwSize改成0,在这里把它改为0,和读取写入的程序一样。郝兴峰修改09.11.13
            );
        if (NULL==m_lpFileMapBuffer)
            {
            printf("Server MapViewOfFile 失败!rn");
            }
        }
    memset(m_lpFileMapBuffer,'',m_dwSize);//设置共享内存中的数据为0
    m_iCreateFlag = 1;
    }
//获取共享缓冲区的首指针
LPVOIDCSFMServer::GetBuffer()
    {
    return(m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);
    }
//获取共享缓冲区的大小
DWORDCSFMServer::GetSize()
    {
    returnm_dwSize;
    }
////////////////////////////////////////////////////////////////////////////
// Construction/Destruction (客户端,打开共享缓冲区,读取写入共享缓冲区的数据)
////////////////////////////////////////////////////////////////////////////
CSFMClient::CSFMClient()
    {
    Init();
    //打开共享缓冲区
    Open(FILE_MAP_ALL_ACCESS, DEFAULT_MAPNAME);
    }
CSFMClient::~CSFMClient()
    {
    Destory();
    }
CSFMClient::CSFMClient(DWORDdwAccess,char*szMapName,DWORDisizemap)
    {
    Init();
    m_dwSize=isizemap;
    //打开共享缓冲区
    Open(dwAccess, szMapName);
    }
voidCSFMClient::Open(DWORDdwAccess,char*szMapName)
    {
    if(m_iOpenFlag)
        Destory();
    if(szMapName)
        {
        m_pMapName = _strdup(szMapName);
        m_strMutexName=szMapName;
        m_strMutexName+="mutex";
        }
    else
        {
        m_pMapName = _strdup(DEFAULT_MAPNAME);
        m_strMutexName=DEFAULT_MAPNAME;
        m_strMutexName+="mutex";
        }
    try
        {
        m_hFileMap = OpenFileMapping(
            FILE_MAP_ALL_ACCESS,
            FALSE,
            m_pMapName
            );
        if (m_hFileMap)
            {
            m_lpFileMapBuffer = MapViewOfFile(
               m_hFileMap,
               FILE_MAP_ALL_ACCESS,
               0,
               0,
               0//hxf修改,把0改成m_dwSize。把m_dwSize改成0,和上面的创建性质一样、郝兴峰,09.11.13
               );
            if (NULL==m_lpFileMapBuffer)
               {
               printf("Client MapViewOfFile失败!rn");
               }
            m_hMutex=OpenMutex(SYNCHRONIZE,FALSE,m_strMutexName.c_str());
            }
        else
            {
            printf("Client OpenFileMapping失败!rn");
            }
        }
    catch(exception &e)
        {
        printf("Client MapViewOfFile或者Client OpenFileMapping异常rn");
        printf("%srn",e.what());
        }
    m_iOpenFlag = 1;
    }
voidCSFMClient::Init()
    {
    m_hFileMap = NULL;
    m_lpFileMapBuffer = NULL;
    m_hMutex=NULL;
    m_pMapName = NULL;
    m_dwSize=0;
    m_iOpenFlag = 0;
    }
voidCSFMClient::Destory()
    {
    if(m_lpFileMapBuffer)
        {
        if (!UnmapViewOfFile(m_lpFileMapBuffer))
            {
            printf("Client UnmapViewOfFile 失败!rn");
            }
        m_lpFileMapBuffer = NULL;
        }
    if(m_hFileMap)
        {
        if(!CloseHandle(m_hFileMap))
            {
            printf("Client 关闭映射文件句柄失败!rn");
            }
        m_hFileMap = NULL;
        }
    if(m_pMapName)
        {
        free(m_pMapName);
        m_pMapName = NULL;
        }
    if(m_hMutex)
        {
        if (!CloseHandle(m_hMutex))
            {
            printf("Client 关闭互斥体句柄失败!rn");
            }
        m_hMutex=NULL;
        }
    Init();
    }
LPVOIDCSFMClient::GetBuffer()
    {
    return(m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);
    }
//这里可能有点问题
DWORDCSFMClient::GetSize()
    {
    // unnable use
    returnm_dwSize;
    }

 






也可以参考这个:

http://www.codeproject.com/Articles/1547/Shared-memory

设置一个非常好用的内存共享类,目前实在VC6下开发的,所以如果要在高版本VC用,要简单修改一下循环中的变量;

这个类功能非常强大,而且也很好用,有示例工程,这里我简单写一个示例:


#include "SharedMemory.h"


CSharedMemory * m_psm = NULL;


#define MEMORY_SIZE 10000


char * pstr = "abcdefghijklmnopqrstuvwxyz";


void Ctmfc1Dlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码


SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE);


SECURITY_ATTRIBUTES sa = { sizeof sa, &sd, FALSE };


m_psm = new CSharedMemory(_T("TestMemory"),MEMORY_SIZE);


// if ((m_psm) && (m_psm->IsCreated()) && (! m_psm->ExistValue(_T("Test")))) 
// {
// m_psm->AddDwordValue(_T("Test"),1);
// 


}




void Ctmfc1Dlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码


if ( (m_psm) && (m_psm->IsCreated()) )
{
m_psm->Write( (BYTE*)pstr, strlen(pstr) );
}


}


void Ctmfc1Dlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码


char strch[1000]={0};


if ( (m_psm) && (m_psm->IsCreated()) )
{
m_psm->Read( (BYTE*)strch, 100 );
}




MessageBox( CString(strch) ); 


}

原创粉丝点击