C 開發windows服務的一些心得

2022-07-18 18:27:19 字數 2351 閱讀 5682

最近在做乙個windows服務的專案,發現並解決了一些問題,拿出來和大家分享一下,以下windows服務簡稱「服務」

文章會在適合時間更新,因為朋友們在不斷提出新的意見或思路,感謝~。~

1.服務如何在某種情況下彈出乙個窗體?

第一種解決辦法,用安裝程式的**修改登錄檔來完成:

1.右擊服務的檢視設計介面的空白處,新增安裝程式

2.右擊預設的serviceprocessinstaller1-->屬性-->account屬性設定為localsystem

3.右擊安裝程式空白處-->檢視**,新增以下**

public

override

void

install(idictionary stateserver)

catch

(exception e)

}public

override

void

uninstall(idictionary stateserver)

catch

(exception e)

finally

}

這個方法很多,也可以在網上搜到

第二種解決辦法,用bat批處理檔案修改登錄檔完成(如果已經執行的服務不是localsystem賬戶,是不允許與桌面互動的)

建立乙個bat檔案,寫入以下**,儲存並雙擊執行,點選 y 回車更改服務賬戶

reg add hkey_local_machine\system\currentcontrolset\services\自己服務的名稱/v objectname /t reg_sz /d localsystem

如果想直接修改登錄檔,在以上**前加"echo y|"   (沒有雙引號) 這樣雙擊執行的時候就可以直接修改了

第三種解決辦法也是最簡單的辦法,通過手動修改

開啟服務控制器,右擊要修改賬戶的服務屬性,登入選項卡,修改為本地系統賬戶,並允許與桌面互動

2.服務如何獲取程式當前的路徑?

服務中使用environment.currentdirectory獲取的是system32的路徑

解決辦法:新增引用:window.form

(其它方法暫時還沒有嘗試,所以先不寫了)

3.如何使用timer?

和form不同,服務有專門的timer

右擊工具箱"選擇項",.netframework元件:找到timer

別搞成form裡的timer

4服務的更新

服務有時候出了問題也會用到更新,安裝服務機子少時候可以自己手動更新,多的話,像上百臺或更多,在做需求的時候就要想到更新程式是如此的重要

我就是在這方面吃了大虧,請朋友們引以為戒

1.兩個服務一定要分開兩個專案來寫,如果在乙個專案裡寫兩個服務,在更新的時候就會提示程式正在訪問無法執行而更新失敗

2.b服務要設定為手動啟動,如果早與a服務自動啟動。並且a服務檢測到有更新檔案,將無法完成b服務的更新

3.b服務設定為手動啟動,並不是讓你手動去啟動b服務。是通過a來啟動b。

啟動方式如下:

條件:b服務為localsystem,並且b服務已經安裝完成

利用程序啟動b服務

public

void

runservice()

catch

(exception)

}

其它方式有待改進,暫不貼出

5服務的除錯

個人知道的有兩種服務除錯的方式

1是用vs,附加到程序來做除錯,步驟比較簡單但也有缺點

(1)安裝和啟動乙個服務以後,點選vs中的除錯-->附加到程序(注意選擇"附加到"這個選項,一定要是自己程式的**,我用的.net4.0,所以我選擇的是"託管4.0版**")

(2)找到自己的程式程序,附加即可

這種方式的缺點:因為是在啟動以後才可以附加到程序.服務的onstart方法無法除錯。所以我一般都會把**放到onstop方法裡除錯

2是做除錯日誌,每個步驟寫日誌的方式來檢測服務是否正常啟動等(我一直沒用過,暫無介紹)不過個人認為這種方式也會有缺點.沒有斷點除錯那樣直觀

不過有機會可以試試這種方式

多說都是淚,方法和思路都是自己試出來的,有什麼**或思路錯誤請朋友們提出,對的點個贊,謝謝~

感謝區:

C 操作Windows服務的一些方法

學習 主要方法 啟動某個服務 停止某個服務 判斷是否安裝了某個服務 判斷某個服務是否啟動 在操作windows服務之前,先新增引用 system.serviceprocess 1.判斷是否安裝某服務 判斷是否安裝了某個服務 public static bool iswindowsserviceins...

windows的一些命令

start 檔名 自動用預設程式開啟檔案 例 start a.txt 自動用記事本開啟a.txt 還有 c windows 這樣的,可以直接開啟相應的資料夾 在執行視窗輸入 scanreg fix 用於檢測掃瞄登錄檔 scnareg restore 則可以使登錄檔恢復到最近幾天的樣子 ipconfi...

c 開發windows服務

摘自 微軟的專案模板能很好的支援windows服務開發,如c 的windows服務專案 c 開發的話,也不難,使用一些api就能實現,下附 cpp view plain copy include stdafx.h include windows.h define service name srv d...