직접 테스트 해보진 않았지만 아래 방법으로도 서비스 통신이 된다고 합니다.
깔끔하게 사용할 수 있지 않을까 하는 생각이 드네요.
출처 : 클릭
서비스->응용프로그램, 응용프로그램->서비스 로의 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);
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);
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);
}
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;
{
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();
}
}
}
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 |