當我們建立乙個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 相關聯的那個鎖。只要主線程 占有著這個鎖,第二個執行緒就不可能執行同步化的靜態方法。具...