給WINDOWS服務加上描述

2022-01-17 10:21:25 字數 3652 閱讀 3825

當我們建立乙個windows服務後,卻發覺我們所建立的服務沒有相關的描述。(你可以開啟服務管理器程式檢視)。而system.serviceprocess.servicebase這些相關的類都沒有提供這方面的資訊。同樣如果我們需要給我們的服務加上恰當的描述,我們也只能通過非託管**來處理。

using system;

using system.runtime.interopservices;

namespace filewatchservice

public enum servicestarttype:int

public enum serviceerrorcontrol:int

public enum servicestaterequest:int

public enum servicecontroltype:int

public enum servicestate:int

public enum servicecontrolaccepted:int

public enum servicecontrolmanagertype:int

public enum access_type:int

[structlayout(layoutkind.sequential)]

public struct service_status

[structlayout(layoutkind.sequential)]

public struct query_service_config

public enum sc_action_type:int

[structlayout(layoutkind.sequential)]

public struct sc_action

public enum infolevel:int

[structlayout(layoutkind.sequential)]

public struct service_description

[structlayout(layoutkind.sequential)]

public struct service_failure_actions}}

當我們給服務增加安裝包時,我們可以在projectinstaller裡加上我們修改服務描述的**

private void initializecomponent()

iscmanagerlockhandle = modapi.lockservicedatabase(iscmanagerhandle);

if (iscmanagerlockhandle < 1)

//服務名

iservicehandle = modapi.openservicea(iscmanagerhandle, "jadewatchservice",

modapi.access_type.service_all_access);

if (iservicehandle < 1)

bchangeserviceconfig = modapi.changeserviceconfiga(iservicehandle,

modapi.servicetype.service_win32_own_process | modapi.servicetype.service_interactive_process,

modapi.service_no_change, modapi.service_no_change, null, null,

0, null, null, null, null);

if (bchangeserviceconfig==false)

servicedescription.lpdescription = "青鳥檔案監控服務,如果停止該服務,資料將不能正常進行備份!";

bchangeserviceconfig2 = modapi.changeserviceconfig2a(iservicehandle,

modapi.infolevel.service_config_description,ref servicedescription);

if (bchangeserviceconfig2==false)

servicefailureactions.dwresetperiod = 600;

servicefailureactions.lprebootmsg = "服務啟動失敗! 重啟中...";

// servicefailureactions.lpcommand = "somecommand.exe param1 param2";

servicefailureactions.lpcommand = "";

servicefailureactions.cactions = scactions.length;

//故障恢復設定,這裡沒有設定

scactions[0].delay = 20000;

scactions[0].scactiontype = modapi.sc_action_type.sc_action_none; //不要對失敗操作做任何處理,如果重啟服務等

scactions[1].delay = 20000;

scactions[1].scactiontype = modapi.sc_action_type.sc_action_none;

scactions[2].delay = 20000;

scactions[2].scactiontype = modapi.sc_action_type.sc_action_none;

iscactionspointer = marshal.allochglobal(marshal.sizeof(new modapi.sc_action()) * 3);

modapi.copymemory(iscactionspointer, scactions, marshal.sizeof(new modapi.sc_action()) * 3);

servicefailureactions.lpsaactions = iscactionspointer.toint32();

bchangeserviceconfig2 = modapi.changeserviceconfig2a(iservicehandle,

modapi.infolevel.service_config_failure_actions,ref servicefailureactions);

if (bchangeserviceconfig2==false)

}catch(exception ex)

finally

if (iscmanagerlockhandle > 0)

if (iscmanagerhandle != 0)}}

在安裝完成後,我們對服務進行。這裡可以修改的內容包括服務的描述,服務的故障處理等.

如果你在安裝時,需要對服務進行自動處於執行狀態,或解除安裝時需要自動將服務也解除安裝,你只要註冊

this.beforeuninstall+=new installeventhandler(projectinstaller_beforeuninstall);

this.committed+=new installeventhandler(projectinstaller_committed);

這二個事件

committed事件,在這裡可以將安裝的服務進行調整到執行狀態

beforeuninstall事件,您可以在這裡將服務自動解除安裝掉

給數字加上註解

注釋 命名清晰 簡單,單獨的變數使用,例如 變數定義 int a 1 判斷 if a 1 這些情況下通常會利用巨集定義來代替這些幻數 魔數,例如 定義 define max 1 使用 a max if a max 陣列使用,例如 gui程式設計需要定義5個按鍵,class,pop,定義 button...

給postmessage加上callback方法

postmessage雙向通訊中,是不能使用 函式的。window.postmessage 這樣是不行的,js會提示function不會被轉殖。我猜啊因為postmessage是通過dom通訊,js物件會被json化 也就是說不能傳遞方法。不過,話說回來,有什麼不能的呢,大不了,把function ...

當給main加上synchronized

1。在乙個同步化的靜態方法執行之前,它會獲取與它的class 物件相關聯的乙個管程 monitor 鎖 jls 8.4.3.6 所以在上面的程式中,主線程會在建立第二個執行緒之前獲得與pingpong.class 相關聯的那個鎖。只要主線程 占有著這個鎖,第二個執行緒就不可能執行同步化的靜態方法。具...