직접 테스트 해보진 않았지만 아래 방법으로도 서비스 통신이 된다고 합니다.
깔끔하게 사용할 수 있지 않을까 하는 생각이 드네요.

출처 : 클릭

서비스->응용프로그램, 응용프로그램->서비스 로의 IPC가 가능하네요.
기본적으로 응용프로그램->서비스로는 User Define 이벤트를 제공하니 문제가 안될 것 같구요.
 
우선 서비스를 아래와 같이 SERVICE_INTERACTIVE_PROCESS 프로세스를 추가하고,
 
 // 서비스를 등록한다.
 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;
}

'프로그래밍 팁 > etc' 카테고리의 다른 글

맥어드래스 읽어오는 여러가지 방법  (0) 2011.07.05
전치행렬 프로그램  (0) 2011.06.15
전체 화면이 사용 중인지 판단하기  (0) 2011.05.26
권한 정보 조회(UAC)  (0) 2011.05.13
my_strtok_s 구현  (0) 2011.03.24
Posted by 띠깜
,