系統服務和普通FORMS程式共存一體的實現

2021-04-30 09:07:17 字數 2752 閱讀 3183

要求:乙個exe,如何將它做成這樣的效果:

1、雙擊它時,像乙個forms程式那樣正常顯示窗體執行。

2、註冊成系統服務,每次都可以從service.msc中啟動它。

也就是說,沒註冊之前,它可以當作普通forms程式執行,註冊之後,它就可以當系統服務執行。

做法:參考delphi 裡面scktsrvr的源**,program files/borland/delphi7/bin 搜尋scktsrvr 就會看到有個scktsrvr.dpr,檢視它的工程源程式,原理:在啟動程式時,通過啟動的方式來決定如何引導程式。

必須的地方使用紅色標記:

program rodblayer;

// remobjects: careful, do not remove!

uses

urocominit,

//增加引用

svcmgr,  forms,    sysutils,  winsvc,

rodblayerservice in 'rodblayerservice.pas' ,

rodblayerservices_intf in 'rodblayerservices_intf.pas',

rodblayerservices_invk in 'rodblayerservices_invk.pas',

uadoconnectionpool in 'uadoconnectionpool.pas',

uconnectionpool in 'uconnectionpool.pas',

comm in 'comm.pas',

config in 'config.pas' ,

rodblayerservices_impl in 'rodblayerservices_impl.pas';

//步驟一、查詢是否通過命令列來註冊或註消 ,如是則表明是系統服務

functioninstalling: boolean;

begin

result := findcmdlineswitch('install',['-','/','/'], true) or

findcmdlineswitch('uninstall',['-','/','/'], true);

end;

//步驟二、檢測是否是系統服務中啟動服務;

function startservice:boolean;

var

mgr, svc: integer;

username, servicestartname: string;

config: pointer;

size: dword;

begin

result := false;

mgr := openscmanager(nil, nil, sc_manager_all_access);

if mgr <> 0 then

begin

//'rodbservices'代表服務名(services name),不是指服務顯示名(services display name)

//它根據你的服務而定。

svc := openservice(mgr, pchar('rodbservices'), service_all_access);

result := svc <> 0;

if result then

begin

queryserviceconfig(svc, nil, 0, size);

config := allocmem(size);

tryqueryserviceconfig(svc, config, size, size);

servicestartname := pqueryserviceconfig(config)^.lpservicestartname;

if comparetext(servicestartname, 'localsystem') = 0 then

servicestartname := 'system';

finally

dispose(config);

end;

closeservicehandle(svc);

end;

closeservicehandle(mgr);

end;

if result then

begin

size := 256;

setlength(username, size);

getusername(pchar(username), size);

setlength(username, strlen(pchar(username)));

result := comparetext(username, servicestartname) = 0;

end;

end;

//步驟

三、判斷

begin

if not installing then

begin

createmutex(nil, true, 'rodbservices');  //建立乙個互斥體;

程式任務系統定時啟動服務

每日一貼,今天的內容關鍵字為程式任務 有法方2中 1 1.cmd 2.at 8 32 everymonday,tuesday,wednesday,thursday,friday d program files tongda ispirit ispiritpro.exe 這樣就能夠在籌畫任務看到 2 ...

關於系統服務程式的編寫

什麼是服務?服務也是一種應用程式的型別,與普通程式不同的是,服務程式總是在後台默默執行,使用者察覺不到,並且開機時即立刻啟動,但在任務管理器中不存在對應的程序。如何檢視服務?那麼既然在任務管理器中不存在相應的程序,我們如何取消服務呢?在 我的電腦 上單擊右鍵,在選單中選擇 管理 服務和應用程式 服務...

為DataSnap系統服務程式新增描述

delphi2010中datasnap高階技術 1 為datasnap系統服務程式新增描述 收藏 這幾天一直在研究delphi 2010的datasnap,感覺功能真是很強大,現在足有理由證明delphi7該下崗了。現找到辦法新增描述 procedure tservercontainer2.serv...