主進程源碼:
#include
#include
#include
#include
TCHAR g_ShareMemCMD[] = "testipc/buf";
const int g_ShareMemSize = 512;
int main( void )
{
//創建子進程
STARTUPINFO
si={sizeof(si)};
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
TCHAR chPath[]=TEXT("E:\\my project\\testpro\\testMessage\\Debug\\childProcess.exe"); //我的child.exe程序位於該目錄下,作爲第一
//個參數傳給CreateProcess
if(CreateProcess(chPath, NULL, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
CloseHandle( pi.hProcess
);
//hProcess跟hThread爲pi的成員,分別爲進程跟線程的句柄
CloseHandle( pi.hThread );
}
else
{
printf("%s","Child process created faild!\n");
}
void * m_hMapCMD = NULL;
SECURITY_ATTRIBUTES SecAttr;
SECURITY_DESCRIPTOR
SecDesc;
SecAttr.nLength = sizeof(SecAttr);
SecAttr.bInheritHandle = FALSE;
SecAttr.lpSecurityDescriptor = &SecDesc;
//指向訪問權限列表
InitializeSecurityDescriptor(&SecDesc,
SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&SecDesc, TRUE, 0, FALSE);
//設置訪問權限列表爲空(不受限制)
m_hMapCMD = CreateFileMapping(
INVALID_HANDLE_VALUE,
// use paging file
&SecAttr,
PAGE_EXECUTE_READWRITE,
// read/write access
0,
// maximum object size (high-order DWORD)
g_ShareMemSize,
// maximum object size (low-order DWORD)
g_ShareMemCMD);
if (NULL == m_hMapCMD)
{
printf("could not create file mapping object(%d).\n",
GetLastError());
}
void * m_pCMDBuf = NULL;
m_pCMDBuf = (char*) MapViewOfFile(m_hMapCMD, FILE_MAP_ALL_ACCESS,
0, 0, g_ShareMemSize);
if (NULL == m_pCMDBuf)
{
printf("could not map view of file .\n");
}
int * p = (int*)m_pCMDBuf;
*p = 123454321;
printf("shareMemery id is : %d\n", *p);
printf(" 新進程的主線程ID號:%d /n", pi.dwThreadId);
Sleep(1000);
int j = 5;
while(j--)
{
if(0 != PostThreadMessage(pi.dwThreadId,
WM_USER,0,0))
{
printf("postthreadmessage
success !\n");
break;
}
else
{
printf("postthreadmessage
fialed !\n");
Sleep(1000);
}
}
SYSTEMTIME sys;
while(true){
GetLocalTime( &sys );
printf("%s","The parent is talking at ");
printf( "M/d/d d:d:d 星期\n", sys.wYear,
sys.wMonth, sys.wDay, sys.wHour, sys.wMinute,
sys.wSecond,sys.wDayOfWeek);
Sleep(2000);
}
return 0;
}
子進程源碼:
#include
#include
TCHAR g_ShareMemCMD[] = "testipc/buf";
const int g_ShareMemSize = 512;
int main( void )
{
printf("child process!");
DWORD threadId = GetCurrentThreadId();
printf("%d\n", threadId);
void * m_hMapCMD = NULL;
m_hMapCMD = OpenFileMapping(
FILE_MAP_ALL_ACCESS, //
read/write access
FALSE,
// do not inherit the name
g_ShareMemCMD);
if (NULL == m_hMapCMD)
{
printf("could not create file mapping object(%d).\n",
GetLastError());
}
void * m_pCMDBuf = NULL;
m_pCMDBuf = (char*) MapViewOfFile(m_hMapCMD, FILE_MAP_ALL_ACCESS,
0, 0, g_ShareMemSize);
if (NULL == m_pCMDBuf)
{
printf("could not map view of file .\n");
}
int * p1 = (int*)m_pCMDBuf;
printf("shareMemery id is : %d\n", *p1);
MSG msg;
int i = 5;
while(i--)
{
if (0 == PeekMessage(&msg,
NULL, WM_USER, WM_USER, PM_NOREMOVE))
{
printf("peekmessage
failed!\n");
Sleep(1000);
}
else
{
printf("peekmessage
success!\n");
break;
}
}
SYSTEMTIME sys;
while(true){
GetLocalTime( &sys );
printf("%s","The child is talking at ");
printf( "M/d/d d:d:d 星期\n", sys.wYear,
sys.wMonth, sys.wDay, sys.wHour, sys.wMinute,
sys.wSecond,sys.wDayOfWeek);
Sleep(2000);
}
return 0;
}