none
windows服務 RRS feed

  • 問題

  • 各位大大您们好,請問windows服務可以將我已經寫好的程式(是一個可以監控機器的許多表單並顯示他們的狀況),加入windows下的服務嗎,也就是當使用者安裝我的程式時,我的程式也會顯示在windows下的服務,達到即使電腦在登出中,我的程式還是持續執行中,於由我在網路上看到許多範例,可是大家都只是介紹windows如何加入服務,確無法解決我的疑問,謝謝
    2009年2月5日 上午 01:17

解答

  • 你的問題技術上實現比較複雜需要一些高階技巧
    原因
    你原來的程式有包含GUI部分的控制介面
    而Windows Service是不能有GUI的,因為它是背景執行,所以Windows Service可以在未登入電腦之前執行.

    所以你無法很直接的將你現有的程式包在Windows Service中.

    解決方式

    第一,你必須把你的程式分為兩個
    1.GUI控制部分
    2.真正在背景執行部分
    第2部分該如何區分?其實很簡單,只要寫出來的程式不需要人為控制可以運作就對了.

    第二,最麻煩的地方
    因第一點你已經將程式分為兩個,所以這兩個程式是獨立個體,你必須找出一種方式讓兩者能夠溝通
    底下是可行的幾種方式
    1.用資料庫或設定檔溝通-這種方式較容易,但無法做到即時.
    2.如要做到即時就必須透過一些網路連線方式如WinSocket或是.net提供的WCF或Remoting等方式.
    當然這樣做所需要的技術需要較深.
    目前我有些系統是用Remoting來實現跟你類似的情況,但都相當複雜.

    • 已提議為解答 Johnny.Net 2009年2月6日 上午 02:17
    • 已標示為解答 冰糖旋風 2009年2月11日 上午 08:32
    2009年2月5日 上午 08:03

所有回覆

  • HI,

    如果您是想要將普通的Windows程式執行成Windows Service, 可以找一些工具來用, 請參考:
    http://run-as-windows-service.qarchive.org/

    tihs
    2009年2月5日 上午 02:36
  • 這位大大您好:我是已經寫成一個程式可以使用,但現在問題在於我要如何使他在使用者電腦登出時,我的程式仍可執行,我知道windows有提供這樣的服務,我也使用過,可是我還是不了解如何將使服務加入自己的程式中,因為我加入後是不可行的,謝謝。
    2009年2月5日 上午 05:23
  • 您可以參考下列連結:
    http://sujithcjose.blogspot.com/2008/07/calling-exe-from-windows-service.html

    其中有提到:
    A service won't be able to show the GUI of an application, so if the application you are calling has any GUI you won't be able to see it. But the process will get kicked off and you can see the evidence in TaskManager. But we can enable the service to popup the UI by enabling this settings.

    Allow Services to interact with desktop
    1. Start > Run > Services.msc
    2. Locate the services which you have created
    3. Right click and select properties.
    4. Select "Log On" tab on the top of the screen
    5. Select "Allow Services to interact with desktop" check box.
    6. Click on "Apply" and start the services.

    微軟技術支援中心(CSS) - http://twitter.com/msdn_taiwan
    • 已提議為解答 Johnny.Net 2009年2月6日 上午 02:18
    2009年2月5日 上午 05:39
  • 你的問題技術上實現比較複雜需要一些高階技巧
    原因
    你原來的程式有包含GUI部分的控制介面
    而Windows Service是不能有GUI的,因為它是背景執行,所以Windows Service可以在未登入電腦之前執行.

    所以你無法很直接的將你現有的程式包在Windows Service中.

    解決方式

    第一,你必須把你的程式分為兩個
    1.GUI控制部分
    2.真正在背景執行部分
    第2部分該如何區分?其實很簡單,只要寫出來的程式不需要人為控制可以運作就對了.

    第二,最麻煩的地方
    因第一點你已經將程式分為兩個,所以這兩個程式是獨立個體,你必須找出一種方式讓兩者能夠溝通
    底下是可行的幾種方式
    1.用資料庫或設定檔溝通-這種方式較容易,但無法做到即時.
    2.如要做到即時就必須透過一些網路連線方式如WinSocket或是.net提供的WCF或Remoting等方式.
    當然這樣做所需要的技術需要較深.
    目前我有些系統是用Remoting來實現跟你類似的情況,但都相當複雜.

    • 已提議為解答 Johnny.Net 2009年2月6日 上午 02:17
    • 已標示為解答 冰糖旋風 2009年2月11日 上午 08:32
    2009年2月5日 上午 08:03
  • 這位大大您好,你說的第二種透過網路連線方式,可以再詳細一點嗎,因為設計需要,所以即使比較難,我也會盡力去學習,謝謝
    2009年2月5日 下午 12:26
  • 這位大大您好,我有去了解過網址內容,也有去實現過,不知道是因為他的方式是vb的關係,所以我把他實現再c#上,是沒有動作的耶,寫好的程式,程式不理我,另一點,當我的程式寫好的時候,選項點的那些動作(因為有看到那些步驟需要選擇選項),不可能再叫user去執行壓,所以是否還有別種方法,謝謝您囉~
    2009年2月5日 下午 12:28
  • 跨AP間的溝通方式有很多
    Remoting應該是.Net提供最直覺易用的封裝.
    參考一下這篇"入門"範例
    http://www.codeproject.com/KB/IP/remotinggui.aspx
    上面連結內容看過後就可以知道Remoting大概在做甚麼.
    不過Remoting細節非常之多,如果要真正可以拿來應用還需深入了解.

    目前我有個類似應用
    程式是個Windows Service,因Windows Service無法有GUI,所以透過Remoting將此Service運作中的一些Log資訊丟到另一隻Windows GUI程式來觀看.
    應該跟你的需求類似.
    2009年2月6日 上午 12:23
  • 這位大大您好,謝謝你提供的網址,因為我有弄過winSocket我想他們應該都是依樣,也是透過類似網路達到溝通,我也有寫過winSocket,可是還是不太清楚怎麼把他組合在一起,不知道你所自己撰寫的範例,是否方便供我參考(如果可以我可以給你信箱,不知是否方便寄給我),謝謝

    2009年2月6日 上午 12:57
  • 我的程式可能無法直接給你,因他是整個系統的一部分,單獨列出有點困難
    但如果你寫過Winsocket程式那你可使用Winsocket來處理即可.

    至於你說不清楚該如何組合在一起的問題我不是很了解意思.
    正常來說你要把你原來的程式拆成兩部分.
    舉個例子
    假設有個Windows Form的程式是用來作溫度監控,GUI上有兩個功能 1.設定監控溫度裝置 2.顯示目前監控裝置即使溫度
    所以第一的動作必須把Windows Form關於監控部分的程式獨立成Windows Service,而GUI的部分不變.
    所以現在會有兩個程式Windows Form GUI與Windows Service.
    但這兩個程式由於是各自獨立,所以必須找一種方式做通訊,如你會的Winsocket.

    大致上動作為
    1.設定監控溫度裝置
    GUI -> 透過Winsocket連到Windows Service -> GUI透過Winsocket傳送命令給Windows Service -> Windows Service執行動作
    2.顯示目前監控裝置即使溫度
    GUI ->透過Winsocket連到Windows Service -> Windows Service偵測到溫度變化->透過Winsocket通知GUI->GUI呈現新溫度.

    2009年2月6日 上午 09:55
  • 這位大大您好,我了解您的意思,我的問題就是現在如你的作法,我有兩個程式,可是對windows service來說,當我電腦登出時,他還是會繼續執行這沒問題,可是問題在,當user再次登入的時候,user不可能再去按一次windows Form GUI的執行檔,而Service也不會主動去執行這個部份(因為windows Form GUI必須先執行才可以跟Service通訊),而這也是我問題的地方,這樣解釋不知道你是否了解,謝謝
    2009年2月6日 下午 04:56
  •  windows Form GUI的執行檔設定為啟動時開啟如何 XD
    學無止境
    2009年2月7日 下午 07:02
  • 不是很了解意思.
    你的意思是說你的Service每次啟動都必須用Windows Form GUI來啟動?
    如果是這樣邏輯上有點怪怪的.
    Windows Service正常來說不會這樣設計.

    如果真是如我所想的
    你的問題其實不用如此麻煩.
    只需要寫單一執行檔即可

    然後在Windows Service的登入頁面的設定中勾選 "允許服務與桌面互動選項" 這樣每次Windows Service啟動時就會顯示你的Windows Services中的GUI部分.
    當然通常很少人會這樣,這樣做表示每次Window Service啟動後會等待User輸入才會開始執行.不建議使用.

    你目前的問題應該是整個架構上有問題,須重新思考

    你是否可以"完整的"把你的程式功能與需求列出 "詳述",我再看看如何幫你規劃.不然真得是在玩猜猜看遊戲了.
    2009年2月9日 上午 12:42
  • 抱歉,我可能不太會描述,我的問題即是,寫了一個監控軟體,他可以監控機器的溫度或者電壓那些,可是當使用者的電腦登出的時候,我的程式就會被關掉,可是我想要再電腦登出,我的程式仍然繼續跑,所以我利用c# 所提供的windows service,但是因為他不能寫控制介面,所以必須將程式分成兩部份撰寫,假設我寫了WindowService.cs和monitor.exe檔,而windowService當它建置時,他就會幫我加入服務裡,可是我的程式monitor.exe還是不知道怎麼跟windowService溝通, 怎麼讓WindowService去執行exe檔。
    還有我知道這個"允許服務與桌面互動選項",可是這項選項,意思就是表示要user自己去執行選擇的動作,可是我想要userㄧ安裝我的檔案,這些步驟都已完成了,不知道我說的問題,您是否了解,抱歉囉,你還要去了解我的問題,謝謝你囉
    2009年2月9日 上午 02:17
  • 確認幾件事
    1.monitor.exe有無GUI?
    2.你說你現在是新建一個Windows Service然後把monitor.exe加入windows service專案內?
    2009年2月9日 上午 03:42
  • 1. 他是由很多form組成的monitor.exe
    2. 應該說我想要把他加入windows Service,這樣不是monitor.exe登出卻仍繼續執行嗎,謝謝
    2009年2月9日 上午 08:57
  • 1.Windows Service不能有GUI的Form.
    2.你這樣做是沒有意義的.

    你不能直接把原來GUI Form直接加入Windows Service中.這樣是沒有任何意義的.
    請按照我前述的方式處理.

    簡單來說Windows Service並不是直接把你的程式原封不動加入,而是你必須改寫你的程式符合Windows Service的方式.
    你現在的問題是你對於Windows Service並不瞭解其運作,建議你先了解,並熟悉Windows Service的寫法.這樣才能告訴你該如何做.
    2009年2月9日 下午 11:58
  • 這位大大您好,我想我知道我的方向了,其實我也早已經有再看windows service,可能還不夠深入吧,我會繼續加油的,那我在額外問個問題,那我可以寫程式執行讓他執行任何的.exe檔嗎,另一個問題是,可以寫程式讓他執行,像 開始->執行->cmd上然後打的一些指令嗎,謝謝
    2009年2月10日 下午 02:49
  • 可以.
    參考
    http://www.yaosansi.com/post/810.html

    另外寫Windows Service給你一些建議
    先用Console Mode編寫,要部屬的時候再轉成Windows Service,因為Windows Service除錯上比較麻煩.
    2009年2月10日 下午 11:29
  • 我知道了。謝謝您囉,等我研究完,還有問題還希望你能繼續幫我,謝謝
    2009年2月11日 上午 12:44
  •  這位大大您好,我想在請問一下Remoting,我有去找過資料,可是我發現,他也是將資料儲存成可序列化,另一端再去儲存的檔案裡叫資料,可是你有跟我提到兩個方法(資料庫和網路),那他這種模式和你說的第一種(從資料庫讀資料)不是一樣嗎,這樣可以即時喔??,那他們是相差在哪裡壓,希望大大幫我解答,謝謝
    2009年2月12日 上午 03:20