서비스 - 프로그램 IPC
서비스->응용프로그램, 응용프로그램->서비스 로의
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;
}