1,即开辟一段内存,然后两个工程的独立线程可以访问它。实现传送数据的目的。
2,
sender:
hMapFile = CreateFileMapping (
(HANDLE)0xFFFFFFFFFFFFFFFF,
NULL,
PAGE_READWRITE ,
0,
100,
"BLShareTest" ) ;
lpBase = (char*)MapViewOfFile (
hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0 ) ;
特别注意:传送的数据必须是赋值之后的。不能直接对lpBase直接赋值,而是通过strcpy赋值,先记下。
reader:HANDLE hMapFile = OpenFileMapping ( FILE_MAP_ALL_ACCESS, //PAGE_READWRITE,
TRUE, "BLShareTest");
lpBase =(char*) MapViewOfFile (
hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0 ) ;
lpBase中为sender的数据。
注:两个工程中的共享内存的名字是一样的。其他的是一些参数的设置。
3,此共享内存还必须有windows的权限,否则open的时候打不开;
void BuildWindowsSecuAttr( SECURITY_ATTRIBUTES *pSecuAttr, SECURITY_DESCRIPTOR *pSecuDesc ){
DWORD aclLength;
PSID pAuthenticatedUsersSID = NULL;
PACL pDACL = NULL;
BOOL bResult = FALSE;
PACCESS_ALLOWED_ACE pACE = NULL;
SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;
SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION;
/* 初始化Security Descriptor */
bResult = InitializeSecurityDescriptor( pSecuDesc, SECURITY_DESCRIPTOR_REVISION );
/* 获取认证用户组的sid */
bResult = AllocateAndInitializeSid( &siaNT, 1, SECURITY_AUTHENTICATED_USER_RID, 0, 0, 0, 0, 0, 0, 0, &pAuthenticatedUsersSID );
/* 计算DACL长度,并分配内存 */
aclLength = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + GetLengthSid(pAuthenticatedUsersSID); // add space for Authenticated Users group ACE
pDACL = (PACL)malloc( aclLength );
/* 初始化DACL */
bResult = InitializeAcl( pDACL, aclLength, ACL_REVISION);
/* 给认证用户组ACE添加到带有全部权限的DACL中 */
bResult = AddAccessAllowedAce( pDACL,
ACL_REVISION,
GENERIC_ALL,
//GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE,
pAuthenticatedUsersSID );
// bResult = SetSecurityDescriptorDacl( pSecuDesc, TRUE, pDACL, FALSE );
bResult = SetSecurityDescriptorDacl( pSecuDesc, TRUE, NULL, FALSE ); //pDACL参数传NULL表示建立NULL DACL,允许所有的访问
/* 初始化security attributes结构体 */
pSecuAttr->nLength = sizeof(SECURITY_ATTRIBUTES);
pSecuAttr->lpSecurityDescriptor = pSecuDesc;
pSecuAttr->bInheritHandle = FALSE;
}/*BuildWindowsSecuAttr()*/ SECURITY_ATTRIBUTES secuAttr;
SECURITY_DESCRIPTOR secuDesc;
BuildWindowsSecuAttr( &secuAttr, &secuDesc );