導航:首頁 > 編程語言 > 編寫windows服務程序嗎

編寫windows服務程序嗎

發布時間:2024-07-27 08:57:51

A. 如何將自己的程序做成windows服務

1、安裝自己的軟體,我們把軟體安裝到「C:\Program Files (x86)\***\」這個目錄下。
2、下載Instsrv.exe和Srvany.exe。Instsrv.exe可以給系統安裝和刪除服務,Srvany.exe可以讓程序以服務的方式運行。
2、將Instsrv.exe和Srvany.exe放置到某目錄下,我們把它們保存在「C:\Program Files (x86)\***\」目錄下。
3、打開CMD,輸入以下內容:
"C:\Program Files (x86)\***\instsrv.exe" 服務名 "C:\ProgramFiles (x86)\***\srvany.exe"
回車後,如果沒有錯誤就會出現如下所示的成功提示:

注意:服務名可以自己定義。上述即使cd到instsrv.exe或srvany.exe所在目錄,也需要寫instsrv.exe或srvany.exe文件的絕對路徑而不能用相對路徑,否則會出現如下錯誤:
The fully qualified path to the .EXE must be given
4、打開regedit注冊表編輯器,找到以下目錄:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服務名
如下圖所示:
5、滑鼠右鍵單擊<ServerName>,創建一個"項",名稱為"Parameters"。如下圖:
6、滑鼠左鍵單擊"Parameters",在右邊點擊滑鼠右鍵,創建一個"字元串值"(REG_SZ),名稱為"Application",數值數據里填寫你要執行的程序完整路徑。也就是要填上:
C:\Program Files (x86)***\***.exe
如下圖所示:
7、滑鼠左鍵單擊"Parameters",在右邊點擊滑鼠右鍵,創建一個"字元串值"(REG_SZ),名稱為"AppDirectory",數值數據里填寫你要執行的程序的所在目錄的路徑。
也就是要填上:
C:\Program Files (x86)***\
打開services.msc服務或控制面板,可以看到<ServerName>已經存在了。
滑鼠右鍵-屬性-登陸,勾選"允許服務與桌面交互"(一般你要運行的程序都是有界面的吧)。(這個不起作用,本人試過,界面無法出現,貌似服務不支持帶界面的)

嚴格執行上面的步驟,再次開機後;不需要登錄軟體即可運行起來。

B. 如何編寫windows服務程序

Windows提供了一套後台服務程序編程介面,用戶在編寫後台服務程序時需要遵循一定的編程框架,否則服務程序不能正常運行。
服務程序通常編寫成控制台類型的應用程序,總的來說,一個遵守服務控制管理程序介面要求的程序 包含下面三個函數:
1)服務程序主函數(main):調用系統函數 StartServiceCtrlDispatcher 連接程序主線程到服務控制管理程序。
和其它進程一樣,Main函數是服務進程的入口函數,服務控制管理器(SCM)在啟動服務程序時,會從服務程序的main函數開始執行。在進入點函數裡面要完成ServiceMain的初始化,准確點說是初始化一個SERVICE_TABLE_ENTRY結構數組,這個結構記錄了這個服務程序裡面所包含的所有服務的名稱和服務的進入點函數。然後再調用介面StartServiceCtrlDispatcher 。
Main函數的函數框架如下:
int _tmain(int argc, _TCHAR* argv[])
{
//服務入口點函數表
SERVICE_TABLE_ENTRY dispatchTable[]=
{
{TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main},
{ NULL,NULL}
};
if((argc>1)&&((*argv[1]==『-『)||(argv[1]=="/")))
{
/*
參數個數大於1是安裝或者刪除服務,該操作是由用戶來執行的
當然也可以講這一部分功能另寫一個程序來實現
*/
if(_stricmp("install",argv[1]+1)==0)
{
installService();
}
else if(_stricmp("remove",argv[1]+1)==0)
{
removeService();
}
else if(_stricmp("debug",argv[1]+1)==0)
{
bDebugServer=true;
debugService(argc,argv);
}

}
else
{
/*
如果未能和上面的如何參數匹配,則可能是服務控制管理程序來啟動該程序。 立即調用StartServiceCtrlDispatcher 函數
*/
g_logout.Logout("%s\n", "enter StartServiceCtrlDispatcher...");

//通知服務管理器為每一個服務創建服務線程
if(!StartServiceCtrlDispatcher(dispatchTable))
g_logout.Logout("%s\n", "StartServiceCtrlDispatcher failed.");
else
g_logout.Logout("%s\n", "StartServiceCtrlDispatcher OK.");
}

return 0;

}
SCM啟動一個服務程序之後,它會等待該程序的主線程去調StartServiceCtrlDispatcher。如果那個函數在兩分鍾內沒有被調用,SCM將會認為這個服務有問題,並調用TerminateProcess去殺死這個進程。這就要求你的主線程要盡可能快的調用StartServiceCtrlDispatcher。

2)服務入口點函數(ServiceMain):執行服務初始化任務,同時執行多個服務的服務進程有多個服務入口函數。
在服務入口函數里,必須立即注冊服務控制回調函數。然後調用函數SetServiceStatus 通知SCM 服務現在的狀態,否則SCM會認為服務啟動失敗。
ServiceMain函數框架如下:
void WINAPI Service_Main(Dword dwArgc, LPTSTR *lpszArgv)
{
//注冊服務控制處理函數
sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl);
//如果注冊失敗
if(!sshStatusHandle)
{
g_logout.Logout("%s\n", "RegisterServiceCtrlHandler failed...");
return;
}

//初始化 SERVICE_STATUS 結構中的成員
ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; //可執行文件中只有一個單獨的服務
ssStatus.dwServiceSpecificExitCode=0;
ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; //允許用SCP去停止該服務

//更新服務狀態
if(ReportStatusToSCMgr(SERVICE_START_PENDING,//服務狀態,服務仍在初始化
NO_ERROR,
3000)) //等待時間
SvcInit( dwArgc, lpszArgv ); //服務初始化函數
else
g_logout.Logout("%s\n", "ReportStatusToSCMgr SERVICE_START_PENDING failed...");

}

服務初始化函數SvcInit:
該函數的寫法比較重要。在函數中創建一個等待事件,然後一直等待該事件。該線程在服務接到請求之前一直處於掛起狀態,直到接到服務停止消息。
VOID SvcInit( DWORD dwArgc, LPTSTR *lpszArgv)
{
/*創建事件*/
ghSvcStopEvent = CreateEvent(
NULL, // default security attributes
TRUE, // manual reset event
FALSE, // not signaled
NULL); // no name

if ( ghSvcStopEvent == NULL)
{
ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
return;
}

// Report running status when initialization is complete.

ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );

// 在這里執行服務線程的創建...

while(1)
{
// 等待停止事件被觸發

WaitForSingleObject(ghSvcStopEvent, INFINITE);
ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
return;
}
}

3)控制服務處理程序函數(Handler):在服務程序收到控制請求時由控制分發線程引用。(此處是Service_Ctrl)。
void WINAPI Service_Ctrl(DWORD dwCtrlCode)
{
//處理控制請求碼
switch(dwCtrlCode)
{
//先更新服務狀態為 SERVICDE_STOP_PENDING,再停止服務。
case SERVICE_CONTROL_STOP:
ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
ServiceStop(); //由具體的服務程序實現
/*ssStatus.dwCurrentState=SERVICE_STOPPED;*/

//其它控制請求...

default:
break;
}
}

3. 注意事項
1)安裝服務可以另寫一個程序,也可以並在服務程序當中,比較簡單,這里就不介紹了。
2)服務初始化函數SvcInit里創建等待事件比較重要,在服務接收到服務停止消息後,觸發該事件。
3)Service_Main在等待事件觸發後立即返回,服務進程就會退出了

C. 濡備綍緙栧啓windows鏈嶅姟紼嬪簭

濡備綍緙栧啓windows鏈嶅姟紼嬪簭
By:寮犻箯/Hikvision
榪欎袱澶╂兂瀛︿範鍏充簬濡備綍緙栧啓windows鏈嶅姟紼嬪簭鐨勭煡璇嗭紝灝變笂緗戞煡浜嗕簺璧勬枡銆傜湅浜嗕竴綃囨枃絝犮婄敤C 璇璦緙栧啓Windows 鏈嶅姟紼嬪簭鐨勪簲涓姝ラゃ嬨備絾鍙鑳界敱浜庤瘧鑰呯殑鐤忓拷錛屽繕璁頒簡灝嗗叧閿浠g爜鏀懼叆璇ユ枃妗o紝瀵艱嚧鍒濆﹁呭彲鑳戒細鐪嬩笉鎳傘傛墍浠ュ張鏌ラ槄浜嗙浉鍏寵祫鏂欍傝嚜宸卞畬鎴愪簡銆婄敤C 璇璦緙栧啓Windows 鏈嶅姟紼嬪簭鐨勪簲涓姝ラゃ嬩腑鐨勬牱渚嬬▼搴忋
鍦ㄦ湰鏂囦腑鎴戝笇鏈涜兘緇欏垵瀛﹁呬竴浜涘府鍔╋紝澶ц嚧璁蹭竴涓嬬紪鍐檞indows鏈嶅姟紼嬪簭闇瑕佺殑鐭ヨ瘑銆
棣栧厛Microsoft Windows 鏈嶅姟錛堝嵆錛屼互鍓嶇殑 NT 鏈嶅姟錛変嬌鎮ㄨ兘澶熷壋寤哄湪瀹冧滑鑷宸辯殑 Windows 浼氳瘽涓鍙闀挎椂闂磋繍琛岀殑鍙鎵ц屽簲鐢ㄧ▼搴忋傝繖浜涙湇鍔″彲浠ュ湪璁$畻鏈哄惎鍔ㄦ椂鑷鍔ㄥ惎鍔錛屽彲浠ユ殏鍋滃拰閲嶆柊鍚鍔ㄨ屼笖涓嶆樉紺轟換浣曠敤鎴風晫闈銆傝繖浣挎湇鍔¢潪甯擱傚悎鍦ㄦ湇鍔″櫒涓婁嬌鐢錛屾垨浠諱綍鏃跺欙紝涓轟簡涓嶅獎鍝嶅湪鍚屼竴鍙拌$畻鏈轟笂宸ヤ綔鐨勫叾浠栫敤鎴鳳紝闇瑕侀暱鏃墮棿榪愯屽姛鑳芥椂浣跨敤銆傝繕鍙浠ュ湪涓嶅悓浜庣櫥褰曠敤鎴風殑鐗瑰畾鐢ㄦ埛甯愭埛鎴栭粯璁よ$畻鏈哄笎鎴風殑瀹夊叏涓婁笅鏂囦腑榪愯屾湇鍔°
鏈嶅姟鏄鏈夌姸鎬佺殑錛屽綋鎴戜滑浣跨敤windows鑷甯︾殑鏈嶅姟綆$悊紼嬪簭sc.exe鏌ョ湅鏈嶅姟鐘舵佹椂鍙浠ユ樉紺烘湇鍔$殑褰撳墠鐘舵侊紝榪欎釜鐘舵佹槸鐢辨垜浠鍦ㄧ▼搴忎唬鐮佷腑榪涜屾帶鍒剁殑銆備綘鏈濂藉湪鏈嶅姟鍒濆嬪寲鐨勬椂鍊欏皢鏈嶅姟璁劇疆涓篠ERVICE_START_PENDING錛屽綋鍒濆嬪寲瀹屾瘯鏃惰句負SERVICE_RUNNING錛岃繖浜涚姸
鎬佹槸緋葷粺鑷瀹氫箟鐨勭姸鎬侊紝鍙閫氳繃msdn鏌ョ湅鍏朵粬鐘舵併傝繖涓鐘舵佷俊鎮浣犱細鍦╯c.exe涓鐪嬪埌銆
鍦ㄧ紪鍐檞indows鏈嶅姟紼嬪簭榪囩▼涓浣犻渶瑕佸叧娉ㄧ殑鍑芥暟鏈夛細
1.棣栧厛鏄痬ain鍑芥暟錛岀敱浜巜indows鏈嶅姟涓嶉渶瑕佺晫闈錛屾墍浠ュぇ閮ㄥ垎紼嬪簭涓簑in32鎺у埗鍙板簲鐢ㄧ▼搴忥紝鎵浠ョ▼搴忎富鍑芥暟涓簃ain 鑰屼笉鏄疻inMain()銆傚湪涓誨嚱鏁拌佸仛鐨勪富瑕佸伐浣滃氨鏄鍒濆嬪寲涓涓
SERVICE_TABLE_ENTRY 鍒嗘淳琛ㄧ粨鏋勪綋錛岀劧鍚庤皟鐢⊿tartServiceCtrlDispatcher();榪欏皢鎶婅皟鐢ㄨ繘紼嬬殑涓葷嚎紼嬭漿鎹涓烘帶鍒跺垎媧懼櫒銆傝ュ垎媧懼櫒鍚鍔ㄤ竴涓鏂扮嚎紼嬶紝璇ョ嚎紼嬭繍琛屽垎媧捐〃涓瀵瑰簲浜庝綘鐨勬湇鍔$殑ServiceMain錛堬級鍑芥暟銆係erviceMain錛堬級鍑芥暟灝嗗湪涓嬮潰鎻愬埌銆 姝よ繃紼嬬ず渚嬩唬鐮佸備笅錛
SERVICE_TABLE_ENTRY entrytable[2];
entrytable[0].lpServiceName="testservice";
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; entrytable[1].lpServiceName=NULL; entrytable[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(entrytable);
鍦ㄨ繖涔嬪悗緋葷粺灝嗚嚜鍔ㄥ壋寤轟竴涓綰跨▼鍘繪墽琛孲erviceMain鍑芥暟鐨勫唴瀹癸紝浣犲簲璇ュ皢浣犺佹墽琛岀殑浠誨姟
鍦⊿erviceMain涓寰鐜錛岃繖鏍鋒湇鍔″氨寮濮嬭繍琛屼簡銆
2錛嶴erviceMain鍑芥暟涓簐oid WINAPI ServiceMain錛坕nt argc, char** argv錛夋牸寮忕殑鍑芥暟錛
鍑芥暟鍚嶅瓧鍙浠ヤ換鎰忓畾涔夈傚畠鐨勪綔鐢ㄥ氨鏄錛氬皢浣犻渶瑕佹墽琛岀殑浠誨姟鏀懼埌璇ュ嚱鏁頒腑寰鐜鎵ц屽嵆鍙銆傝繖灝辨槸鏈嶅姟紼嬪簭鐨勫伐浣滃嚱鏁般傚湪ServiceMain鎵ц屼綘鐨勪換鍔″墠錛岄渶瑕佺粰SERVICE_TABLE_ENTRY 鍒嗘淳琛ㄧ粨鏋勪綋榪涜岃祴鍊礆紝娉ㄦ剰鐢變簬姝ゆ椂鏈嶅姟榪樻病鏈夊紑濮嬫墽琛屼綘鐨勪換鍔℃墍浠ユ垜浠灝嗘湇鍔$殑鐘舵佽劇疆涓篠ERVICE_START_PENDING錛屽嵆姝e湪鍒濆嬪寲銆傛垜浠榪涜屽備笅璧嬪礆細
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING;
servicestatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP; //鍦ㄦ湰渚嬩腑鍙鎺ュ彈緋葷粺鍏蟲満鍜屽仠姝㈡湇鍔′袱縐嶆帶鍒跺懡浠 servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0; servicestatus.dwCheckPoint = 0;

2014涓嬪崐騫存暀甯堣祫鏍艱瘉緇熻冨ぇ澶囨垬 涓瀛︽暀甯堣祫鏍艱冭瘯 灝忓︽暀甯堣祫鏍艱冭瘯 騫煎効鏁欏笀璧勬牸鑰冭瘯 鏁欏笀璧勬牸璇侀潰璇

servicestatus.dwWaitHint = 0;
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler);
CtrlHandler涓簐oid WINAPI CtrlHandler(DWORD request)鍨嬬殑鍑芥暟錛屽嚱鏁板悕瀛楀彲浠ヤ換鎰忚懼畾銆傚皢鍦ㄤ笅涓鐐硅插埌銆
Hstatus涓篠ERVICE_STATUS_HANDLE綾誨瀷鐨勫叏灞鍙橀噺銆傚綋闇瑕佹敼鍙樻湇鍔$姸鎬佹椂SetServiceStatus錛堬級鍑芥暟闇瑕佸畠鍋氫負鍙傛暟鏉ユ爣璇嗕竴涓鏈嶅姟銆
3. void WINAPI CtrlHandler(DWORD request)錛屽嚱鏁扮殑涓昏佸姛鑳芥槸錛屾帴鏀剁郴緇熶紶閫掔殑鎺у埗鍛戒護錛屾瘮濡傚綋浣犻氳繃sc.exe鍏抽棴鏈嶅姟鏃訛紝璇ュ嚱鏁頒細鏀跺埌SERVICE_CONTROL_STOP娑堟伅錛屼綘灝卞彲浠ュ規湇鍔¤繘琛屽繀瑕佺殑綆$悊銆傚湪鏈渚嬪瓙紼嬪簭涓灝卞彧鎺ユ敹SERVICE_ACCEPT_SHUTDOWN鍜孲ERVICE_ACCEPT_STOP娑堟伅錛岃繖鏄閫氳繃鍓嶉潰緇檚ervicestatus璧嬪艱懼畾鐨勩
榪欐牱涓涓鍩烘湰鐨勬湇鍔$▼搴忓氨瀹屾垚浜嗐
涓嬮潰璐村嚭鎴戠殑紺轟緥浠g爜浠呬緵鍙傝冦傝ヤ唬鐮佸湪vs2008涓璋冭瘯閫氳繃銆傛湰鏂囩粨鏉熺殑鏃跺欎細闄勪笂濡備綍瀹夎呮湇鍔° #include <stdio.h> #include <Windows.h>
#define SLEEP_TIME 5000 //闂撮殧鏃墮棿
#define FILE_PATH "C:\\log.txt" //淇℃伅杈撳嚭鏂囦歡 bool brun=false;
SERVICE_STATUS servicestatus; SERVICE_STATUS_HANDLE hstatus;
int WriteToLog(char* str);
void WINAPI ServiceMain(int argc, char** argv); void WINAPI CtrlHandler(DWORD request); int InitService();
int WriteToLog(char* str) {
FILE* pfile;
fopen_s(&pfile,FILE_PATH,"a+"); if (pfile==NULL) {
return -1; }
fprintf_s(pfile,"%s\n",str); fclose(pfile); return 0; }
void WINAPI ServiceMain(int argc, char** argv) {
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING; servicestatus.dwControlsAccepted =

SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;//鍦ㄦ湰渚嬩腑鍙鎺ュ彈緋葷粺鍏蟲満鍜屽仠姝㈡湇鍔′袱縐嶆帶鍒跺懡浠
servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0; servicestatus.dwCheckPoint = 0; servicestatus.dwWaitHint = 0;
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler); if (hstatus==0) {
WriteToLog("RegisterServiceCtrlHandler failed"); return; }
WriteToLog("RegisterServiceCtrlHandler success"); //鍚慡CM 鎶ュ憡榪愯岀姸鎬
servicestatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus (hstatus, &servicestatus);
//涓嬮潰灝卞紑濮嬩換鍔″驚鐜浜嗭紝浣犲彲浠ユ坊鍔犱綘鑷宸卞笇鏈涙湇鍔″仛鐨勫伐浣 brun=true;
MEMORYSTATUS memstatus; char str[100]; memset(str,'\0',100); while (brun) {
GlobalMemoryStatus(&memstatus);
int availmb=memstatus.dwAvailPhys/1024/1024;
sprintf_s(str,100,"available memory is %dMB",availmb); WriteToLog(str); Sleep(SLEEP_TIME); }
WriteToLog("service stopped"); }
void WINAPI CtrlHandler(DWORD request) {
switch (request) {
case SERVICE_CONTROL_STOP: brun=false;
servicestatus.dwCurrentState = SERVICE_STOPPED; break;
case SERVICE_CONTROL_SHUTDOWN: brun=false;
servicestatus.dwCurrentState = SERVICE_STOPPED; break;

default: break; }
SetServiceStatus (hstatus, &servicestatus); }
void main() {
SERVICE_TABLE_ENTRY entrytable[2];
entrytable[0].lpServiceName="testservice";
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; entrytable[1].lpServiceName=NULL; entrytable[1].lpServiceProc=NULL; StartServiceCtrlDispatcher(entrytable); }
濡備綍瀹夎呮湇鍔★細
榪愯屽懡浠ゆ彁紺虹 cmd.exe
杈撳叆 sc create testservicename binpath= D:\test.exe 杈撳叆 sc start testservicename 鍚鍔ㄦ湇鍔 杈撳叆sc query 浼氬湪鏈搴曢儴鏄劇ず浣犵殑鏈嶅姟褰撳墠鐨勭姸鎬 杈撳叆 sc stop testservicename 鍋滄㈡湇鍔
杈撳叆 sc delete testservicename鍒犻櫎鏈嶅姟錛岃ユ湇鍔″皢鍦ㄤ笅嬈¢噸鍚鍚庡垹闄わ紝鍦ㄩ噸鍚涔嬪墠灝嗕笉鑳芥敞鍐屽悓涓涓鍚嶅瓧鐨勬湇鍔°

D. MFC可不可以編寫windows服務程序

可以不是控制台的,通過調用CreateService創建服務。
schService = CreateService(
schSCManager, // SCManager database
TEXT("Sample_Srv"), // name of service
lpszDisplayName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
szPath, // path to service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password

dwServerType的屬性要加上SERVICE_INTERACTIVE_PROCESS

這樣服務才能顯示界面。

通過成功的創建服務,系統就會啟動的時候載入你的程序。

E. 濡備綍搴旂敤VS2010涓鏉ュ壋寤篧indows鏈嶅姟紼嬪簭

1錛宯ew project -> 閫夋嫨 ATL Project, 璁劇疆宸ョ▼鍚嶏紝濡傦細PureSsl
2錛屽湪鍚戝肩殑鈥淎pplication Setting鈥濋〉錛屸淎pplication Type鈥濋」閫夋嫨錛 Service(EXE)
3, 鏇存敼涓繪枃浠禤ureSsl.cpp錛屽備笅錛

// PureSsl.cpp : Implementation of WinMain

#include "stdafx.h"
#include "resource.h"
#include "PureSsl_i.h"
#include <atlcomcli.h>
#include <stdio.h>
class CPureSslMole : public ATL::CAtlServiceMoleT< CPureSslMole, IDS_SERVICENAME >
{
public :
DECLARE_LIBID(LIBID_PureSslLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_PURESSL, "{A0D1CDBB-EE9F-4110-9710-498FEB5194F5}")
HRESULT InitializeSecurity() throw()
{
// TODO : Call CoInitializeSecurity and provide the appropriate security settings for your service
// Suggested - PKT Level Authentication,
// Impersonation Level of RPC_C_IMP_LEVEL_IDENTIFY
// and an appropiate Non NULL Security Descriptor.
return S_OK;
}
HRESULT RegisterAppId(bool bService = false) throw ();
HRESULT PreMessageLoop(int nShowCmd) throw();
HRESULT PostMessageLoop() throw();
void OnStop() throw();
void OnPause() throw();
void OnContinue() throw();
};
HRESULT CPureSslMole::RegisterAppId(bool bService ) throw ()
{
HRESULT hr = S_OK;
BOOL res = __super ::RegisterAppId(bService);
if (bService)
{
if (IsInstalled())
{
SC_HANDLE hSCM = ::OpenSCManagerW(NULL, NULL, SERVICE_CHANGE_CONFIG);
SC_HANDLE hService = NULL;
if (hSCM == NULL)
{
hr = ATL::AtlHresultFromLastError();
}
else
{
hService = ::OpenService(hSCM, m_szServiceName, SERVICE_CHANGE_CONFIG);
if (hService != NULL)
{
::ChangeServiceConfig(hService, SERVICE_NO_CHANGE,
SERVICE_AUTO_START,// 淇鏀規湇鍔′負鑷鍔ㄥ惎鍔
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
m_szServiceName); // 閫氳繃淇鏀硅祫婧怚DS_SERVICENAME 淇鏀規湇鍔$殑鏄劇ず鍚嶅瓧
SERVICE_DESCRIPTION Description;
TCHAR szDescription[1024];
ZeroMemory(szDescription, 1024);
ZeroMemory(&Description, sizeof (SERVICE_DESCRIPTION));
lstrcpy(szDescription, _T("嫻嬭瘯鏈嶅姟鎻忚堪淇℃伅" ));
Description.lpDescription = szDescription;
::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &Description);
::CloseServiceHandle(hService);
}
else
{
hr = ATL::AtlHresultFromLastError();
}
::CloseServiceHandle(hSCM);
}
}
}
return hr;
}
HRESULT CPureSslMole::PreMessageLoop(int nShowCmd) throw()
{
// 璁╂殏鍋滅戶緇鎸夐挳鍙浠ヤ嬌鐢
m_status.dwControlsAccepted = m_status.dwControlsAccepted | SERVICE_ACCEPT_PAUSE_CONTINUE;
HRESULT hr = __super::PreMessageLoop(nShowCmd);
// 寰杞疊ug
if (hr == S_FALSE)
hr = S_OK;
// 榪欓噷娣誨姞鑷宸辯殑鍒濆嬪寲浠g爜...
if (SUCCEEDED(hr))
{
// 榪欎釜鐘舵佷竴瀹氳佷慨鏀癸紝鍚﹀垯浼氬嚭鐜1053閿欒錛
// 榪欎釜閿欒鎴戣姳浜嗗緢澶氭椂闂存墠鎼炲畾
SetServiceStatus(SERVICE_RUNNING);
}
return hr;
}
HRESULT CPureSslMole::PostMessageLoop() throw()
{
HRESULT hr = __super ::PostMessageLoop();
if (FAILED(hr))
return hr;
// 榪欓噷娣誨姞鑷宸辯殑娓呴櫎浠g爜
return hr;
}
void CPureSslMole::OnStop() throw()
{
__super::OnStop();
SetServiceStatus(SERVICE_STOPPED);
}
void CPureSslMole::OnPause() throw()
{
__super::OnPause();
SetServiceStatus(SERVICE_PAUSED);
}
void CPureSslMole::OnContinue() throw()
{
__super::OnContinue();
SetServiceStatus(SERVICE_RUNNING);
}

CPureSslMole _AtlMole;
//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/,
LPTSTR /*lpCmdLine*/, int nShowCmd)
{
return _AtlMole.WinMain(nShowCmd);
}

4, 緙栬瘧騫惰劇疆鏈嶅姟
褰揂TL COM瀵硅薄鐢熸垚浣滀負鏈嶅姟錛屽畠鎵嶄細娉ㄥ唽涓烘湰鍦版湇鍔″櫒錛屽苟涓旓紝鍦ㄦ帶鍒墮潰鏉誇笉浼氬嚭鐜板湪鏈嶅姟鍒楄〃銆傝繖鏄鍥犱負錛岃皟璇曟湇鍔′綔涓烘湰鍦版湇鍔″櫒涓婁綔涓烘湇鍔℃洿涓烘柟渚褲傝嫢瑕佸畨瑁呭畠浣滀負鏈嶅姟錛岃瘋繍琛屼互涓嬪懡浠ゆ彁紺:
YourEXE.exe /Service
鑻ヨ佸嵏杞借ユ枃浠訛紝璇瘋繍琛屼互涓嬫搷浣:
YourEXE.exe /UnregServer
鎵撳紑cmd紿楀彛錛岃繘鍏ョ敓鎴愮殑PureSsl.exe鎵鍦ㄧ殑鐩褰曟墽琛岋細
> PureSsl.exe /service
> net start PureSsl
鍗沖彲灝嗘湇鍔¤劇疆鍒版湇鍔$$悊鍣錛屽苟鍚鍔ㄥ畠銆

瑕佸垹闄ゆ湇鍔★細
> sc delete PureSsl
5, 娉ㄦ剰
鏈緇忕4姝ョ洿鎺ヨ繍琛屼細鎶ヤ互涓嬮敊璇錛
The program '[24636] PureSsl.exe: Native' has exited with code 2 (0x2).
鑻ヨ佺洿鎺ュ湪vs涓璋冭瘯榪愯屽簲褰撴墽琛岋細
YourEXE.exe /UnregServer
鍚﹀垯浼氭姤
First-chance exception at 0x75c49673 in CloudS.exe: 0x00000005: 鎷掔粷璁塊棶銆.
The thread 'Win32 Thread' (0x314) has exited with code 1063 (0x427).

F. 怎樣把程序做成WINDOWS服務

在「開始→運行」中鍵入「regedit.exe」,打開「注冊表編輯器」,展開分支「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services」,在右側窗格中顯示的就是本機安裝的服務項。
如果要新建服務,只須點擊「編輯→新建→項」,然後為此項命名,如「test」;然後右擊該項,選擇「新建→字元串值」或「新建→DWORD值」即可。添加一個服務項目具體需要添加的鍵值如下:
「DisplayName」,字元串值,對應服務名稱;
「Description」,字元串值,對應服務描述;
「ImagePath」,字元串值,對應該服務程序所在的路徑;
「ObjectName」,字元串值,值為「LocalSystem」,表示本地登錄;
「ErrorControl」,DWORD值,值為「1」;
「Start」,DWORD值,值為2表示自動運行,值為3表示手動運行,值為4表示禁止;
「Type」,DWORD值,應用程序對應10,其它對應20。

G. c#編寫windows服務程序怎麼自動安裝程序

創建項目
1
創建windows服務項目
2
右鍵點擊Service1.cs,查看代碼
用於編寫操作邏輯代碼
3
代碼中OnStart用於執行服務事件,一般採用線程方式執行方法,便於隔一段事件執行一回
END
安裝服務配置
1
打開Service1.cs視圖界面
2
在視圖內右鍵-->添加安裝程序
3
項目中添加了ProjectInstaller.cs文件,該文件中視圖自動會添加倆個組件
serviceProcessInstaller1
serviceInstaller1
4
選中serviceProcessInstaller1組件,查看屬性,設置account為LocalSystem
5
選中serviceInstaller1組件,查看屬性
設置ServiceName的值,
該值表示在系統服務中的名稱
設置StartType,
如果為Manual則手動啟動,默認停止,如果為Automatic為自動啟動
設置Description,添加服務描述
6
重新生成項目
END
安裝服務
1
點擊
開始,運行中輸入cmd,獲取命令提示符
win7需要已管理員的身份啟動,否則無法安裝
2
輸入
cd
C:\Windows\Microsoft.NET\Framework\v4.0.30319
回車
切換當前目錄,此處需要注意的是,在C:\Windows\Microsoft.NET\Framework目錄下有很多類似版本,具體去哪個目錄要看項目的運行環境,例
如果是.net
framework2.0則需要輸入
cd
C:\Windows\Microsoft.NET\Framework\v2.0.50727
3
輸入
InstallUtil.exe
E:\TestApp\Winform\WinServiceTest\WinServiceTest\bin\Debug\WinServiceTest.exe
回車
說明:E:\TestApp\Winform\WinServiceTest\WinServiceTest\bin\Debug\WinServiceTest.exe表示項目生成的exe文件位置
4
打開服務,就可以看到已經安裝的服務了
END
卸載服務
1
卸載很簡單,打開cmd,
直接輸入
sc
delete
WinServiceTest便可

閱讀全文

與編寫windows服務程序嗎相關的資料

熱點內容
企業微信電腦版怎麼無法接受文件 瀏覽:968
微信個人相冊怎麼隱藏 瀏覽:368
上傳文件時怎麼獲取文件全路徑 瀏覽:955
linuxjs讀取文件 瀏覽:104
exe後綴的pdf文件 瀏覽:381
win8升級到專業版 瀏覽:487
快圖瀏覽quickpiciphone 瀏覽:847
app線稿圖需要哪些要求 瀏覽:752
java只能輸入漢字 瀏覽:630
java定義char 瀏覽:133
excel2007插入壓縮文件 瀏覽:70
怎麼設定自己公司的網站 瀏覽:324
如何在辦公軟體上直接復制文件 瀏覽:939
c語言程序設計矩陣運算 瀏覽:894
影響網路質量因素有哪些 瀏覽:587
最新win10秘鑰在線激活 瀏覽:192
cad導入su8文件無法使用 瀏覽:828
怎麼做編程入門 瀏覽:851
用織夢建手機網站 瀏覽:38
灌南數控編程怎麼學 瀏覽:957

友情鏈接