VC 建立Windows服務

2021-07-04 15:36:07 字數 3574 閱讀 7464

我在開發的時候用到了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等操作...