and so on/윈도우서비스

서비스 - 프로그램 IPC

밀크빵 2013. 3. 20. 17:25


서비스->응용프로그램, 응용프로그램->서비스 로의 IPC가 가능하네요.

기본적으로 응용프로그램->서비스로는 User Define 이벤트를 제공하니 문제가 안될 것 같구요.

 

우선 서비스를 아래와 같이 SERVICE_INTERACTIVE_PROCESS 프로세스를 추가하고,

 

 // 서비스를 등록한다.
http://i1.daumcdn.net/icon/editor/spacer2.gif?v=2 hSrv=CreateService(m_hScm, m_szSrvName, m_szDspName, SERVICE_PAUSE_CONTINUE | SERVICE_CHANGE_CONFIG,
  SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START/*SERVICE_DEMAND_START*/,SERVICE_ERROR_IGNORE,SrvPath,
  NULL,NULL,NULL,NULL,NULL);

 

서비스에서의 데이터를 줄 때 저 같은 경우는 Shared Memory RegisterWindowMessage 를 사용했습니다.

데이터는 구조체를 썼구요.

 

서비스에서  Shared Memoery에 데이터를 썼구요.

어플리케이션으로 데이터가 있음을 알려주기 위해 RegisterWindowMessage를 사용했습니다

 

SERVICE_INFO pSer;
     strcpy(pSer.szMessage, tmp);
     CreateServiceShareMemory(&pSer);

 

HWND hwnd = ::FindWindow(NULL, "WaBis Service Manager");
    if(hwnd){
      ::PostMessage(hwnd, WM_SERVICE_MESSAGE, 0, 0);
      //::PostMessage(hwnd, WM_SERVICE_MESSAGE, (WPARAM)&pSer, 0);
     }

 

어플리케이션에서는

ON_REGISTERED_MESSAGE(WM_SERVICE_MESSAGE, OnWaBISEvtMessage) 정의하고,

 

LRESULT CWaBisServiceManagerDlg::OnWaBISEvtMessage(WPARAM wParam, LPARAM lParam)
{
 
 SERVICE_INFO pSer;// *pInfo = (SERVICE_INFO *)wParam;

 

 int isSuccess = ReadServiceSharedMemory(&pSer);
 if(isSuccess){
  //
서비스의 데이터가 있다면
  if(strlen(pSer.szMessage) !=0){
   m_ListBox.InsertString(0, pSer.szMessage);
   if(m_ListBox.GetCount() > 500){
    m_ListBox.ResetContent();
   }
  }
 } 

 

 return 0;
}