windows 無窗口進程間消息通…

主進程源碼:

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章