// createservice.cpp : 定義應用程式的入口點。
//#include "stdafx.h"
#include #include #include #include #pragma comment(linker,"/subsystem:windows")
//定義全域性函式變數
void init();
bool isinstalled();
bool install();
bool uninstall();
void logevent(lpctstr pszformat, ...);
void winapi servicemain();
void winapi servicestrl(dword dwopcode);
tchar szservicename = _t("fsdeamon");
bool binstall;
service_status_handle hservicestatus;
service_status status;
dword dwthreadid;
int apientry _twinmain(hinstance hinstance,
hinstance hprevinstance,
lptstr lpcmdline,
int ncmdshow)
,
};if (stricmp(lpcmdline, "/install") == 0)
else if (stricmp((lpctstr)lpcmdline, "/uninstall") == 0)
else
}return 0;
}//初始化
void init()
//服務主函式,這在裡進行控制對服務控制的註冊
startupinfo si;
process_information pi;
std::atomicbstopserver;
void winapi servicemain()
setservicestatus(hservicestatus, &status);
status.dwwin32exitcode = s_ok;
status.dwcheckpoint = 0;
status.dwwaithint = 0;
status.dwcurrentstate = service_running;
setservicestatus(hservicestatus, &status);
zeromemory(&si, sizeof(si));
si.cb = sizeof(si);
zeromemory(&pi, sizeof(pi));
char szapipath[max_path] = ;
getmodulefilename(null, szapipath, max_path);
std::string strpath(szapipath);
int pos = strpath.find_last_of('\\', strpath.length());
strpath = strpath.substr(0, pos);
bstopserver = false;
do sleep(5000);
}waitforsingleobject(pi.hprocess, infinite);
dword returncode;
getexitcodeprocess(pi.hprocess, &returncode);
closehandle(pi.hprocess);
closehandle(pi.hthread);
file *p;
p = fopen((strpath + "\\log.txt").c_str(), "ab+");
if (p)
;sprintf_s(msg, "freeswitchconsole exit(%u)\n", returncode);
fwrite(msg, strlen(msg), 1, p);
fclose(p);
}//if(returncode==0)
} while (!bstopserver);
status.dwcurrentstate = service_stopped;
setservicestatus(hservicestatus, &status);
}//description: 服務控制主函式,這裡實現對服務的控制,
// 當在服務管理器上停止或其它操作時,將會執行此處**
void winapi servicestrl(dword dwopcode)
}//判斷服務是否已經被安裝
bool isinstalled()
::closeservicehandle(hscm);
}return bresult;
}//安裝服務函式
bool install()
//獲取程式目錄
tchar szfilepath[max_path];
::getmodulefilename(null, szfilepath, max_path);
//建立服務
sc_handle hservice = ::createservice(hscm, szservicename, szservicename,
service_all_access, service_win32_own_process | service_interactive_process, service_auto_start, service_error_normal,
szfilepath, null, null, _t(""), null, null);
//檢測建立是否成功
if (hservice == null)
//釋放資源
::closeservicehandle(hservice);
::closeservicehandle(hscm);
return true;
}//刪除服務函式
bool uninstall()
//開啟具體服務
sc_handle hservice = ::openservice(hscm, szservicename, service_stop | delete);
if (hservice == null)
//先停止服務
service_status status;
::controlservice(hservice, service_control_stop, &status);
//刪除服務
bool bdelete = ::deleteservice(hservice);
::closeservicehandle(hservice);
::closeservicehandle(hscm);
if (bdelete) return true;
logevent(_t("service could not be deleted"));
return false;
}//記錄服務事件
void logevent(lpctstr pformat, ...)
}
windows守護程序指令碼
今天早上起來的時候發現電驢5點鐘的時候掛了,於是有幾個應該已經下完的東西還停留在95 的樣子。鬱悶之外想寫個守護程序的指令碼,上網搜了下找到這位同學的部落格 url 略加修改便拿來用了。首先是crontab.cmd檔案 如果在unix linux下用crontab那真是很簡單的事了 restart ...
C 寫的windows服務程序守護實現
最近在做乙個windows服務實現windows socket server讀取系統硬體,rfid的內容給web 使用。在測試過程中,發現rfid讀取過程有時會導致服務無端中止。因為涉及到硬體呼叫,查不到具體的原因。所以就簡單的處理,做乙個程序守護,當windows的服務程序退出之後,自動重新開啟。...
windows下守護程序實現
這裡的守護程序指的是無控制終端的程序。linux下執行程序只需要後面新增 就可以實現。有的時候需要設計乙個可以同時在windows和linux下執行的守護程序 為了避免過多的修改 可以新增如下偽指令來實現 ifndef win32 pragma comment linker,subsystem wi...