我在開發的時候用到了dll裡面的函式,開始的時候採用的靜態匯入的方法,但是發現服務開機啟動以後就死掉了,這裡不是dll路徑的問題。
沒辦法,自己只得用動態匯入的方法,還好,服務自動開機執行了,還算正常吧。
當然,我這裡的初始化引數已經設定好了,在dos命令裡面安裝完成後,你會發現,那個框,我已經替你選上了。
//重要說明,服務最好不要直接編譯執行,雖然是exe,最好的方式是安裝,
安裝命令 dos 下: servicename.exe /install
解除安裝命令 dos下 :servicename.exe /uninstall
直接執行exe不僅會報錯,還會導致服務開機不能自動執行。
大多的時候,你直接執行exe都會報1063錯誤,就是因為你把服務以控制台的方式執行了。
// createservice.cpp : 定義應用程式的入口點。
//#include "stdafx.h"
#include #include #include "createservice.h"
//定義全域性函式變數
void init();
bool isinstalled();
bool install();
bool uninstall();
void logevent(lpctstr pszformat, ...);
void winapi servicemain();
void winapi servicestrl(dword dwopcode);
tchar szservicename = _t("watchdog");
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()
//服務主函式,這在裡進行控制對服務控制的註冊
void winapi servicemain()
setservicestatus(hservicestatus, &status);
status.dwwin32exitcode = s_ok;
status.dwcheckpoint = 0;
status.dwwaithint = 0;
status.dwcurrentstate = service_running;
setservicestatus(hservicestatus, &status);
//模擬服務的執行。應用時將主要任務放於此即可
//可在此寫上服務需要執行的**,一般為死迴圈
while(1)
; _sntprintf(time,100,"%4d-%02d-%02d %02d:%02d:%02d\r\n",st.wyear,st.wmonth,st.wday,st.whour,st.wminute,st.wsecond);
fwrite(time,strlen(time),1,p);
fclose(p);
sleep(1000);
}
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, ...)
}
用 VC 建立 Windows 服務程式
本文主要介紹了 openscmanager createservice openservice controlservice deleteservice registerservicectrlhandler setservicestatus startservicectrldispatcher等操作...
用 VC 建立 Windows 服務程式
本文主要介紹了 openscmanager createservice openservice controlservice deleteservice registerservicectrlhandler setservicestatus startservicectrldispatcher等操作...
VC 建立Windows服務程式2
本文主要介紹了 openscmanager createservice openservice controlservice deleteservice registerservicectrlhandler setservicestatus startservicectrldispatcher等操作...