各位老铁们好,相信很多人对nim服务器都不是特别的了解,因此呢,今天就来为大家分享下关于nim服务器以及放映机服务器bgs是什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
一、aix磁盘引导问题
磁盘错误分类
我使用两个主要的度量值来分类 AIX系统上的磁盘错误:影响和持续时间。影响所量度的是磁盘错误的影响力及其对服务器的冲击。换言之,就是“这会造成何程度的伤害?”。持续时间所量度的是磁盘错误持续的时长和恢复时间,即“这伤害将持续多久?”。
影响可分为四个主要级别:
可用*丧失:当存储资源离线或断开与其管理服务器的连接时就会发生可用*丧失。虽然磁盘上的数据没有损失,但是无法访问该磁盘。例如:文件系统遭卸装或光纤通道适配器被断开连接。
数据丢失:由于逻辑或物理问题,数据无法写入磁盘或无法从磁盘读取。例如:LVM写入错误。
跨多个磁盘的数据丢失:在这种情况下,不仅一个磁盘而是多个磁盘均遭遇了数据丢失。当逻辑卷跨磁盘条带化且其中一个磁盘故障时,常常会发生这种情况。
跨多个服务器的数据丢失:随着 SAN技术的广泛应用,一个磁盘硬件可能受损到这样的程度:多个服务器均受到了数据丢失的影响。
同样地,持续时间也可用分为四个主要级别:
暂时:这类磁盘错误不常见且只发生一次,不会带来真正的威胁。它只在服务器的 errpt内出现一次,然后即消失。例如:一次糟糕的块重分配。
间歇:间歇错误的出现很不规律,可以由初期问题推断,比如若硬盘记录了一系列写入错误时,往往表明此驱动器可能会出现故障。
经常:就像是由一个 cron作业定期安排的那样,以周、天、小时或分钟为间隔发生问题,这会对服务器形成严重威胁并具有广泛的有害影响。
永久:不太容易或者根本不可能从这类错误中恢复。缺乏可替换硬件,将不能从这种情况中恢复。
通过交叉参考表中的这两个度量指标,您就能够更好地了解磁盘错误的危急程度以及它们对服务器的影响
恢复步骤
磁盘故障的影响程度不一,从轻微的中断到整个的服务器故障。那么,当遇到故障时该怎么做呢?
第一步是检查磁盘资源的可访问*,从最高可用级别开始一直往下,在需要时使用 errpt作为指导。如果服务器仍在正常运行,那么使用 df或 mount命令进行查看时文件系统是否仍然存在?如果没有,是否能用 lsvg或 varyonvg访问卷组,或是它已丢失了配额(quorum)?磁盘本身是否仍处在 *ailable状态,或者使用 lsdev–Ccdisk命令后,是否显示它们处于的是 Defined状态?像执行 lspath或 pcmpath query adapter这样的 SAN存储命令后,这些光纤通道设备显示的是离线还是丢失?当通过 Hardware Management Console查看时,服务器仅是宕机并处于 Not Activated状态?大型的 System p机器或 SAN子系统宕机了?不要只是因为某一类资源可用而贸然做这样的假设;所有类似资源都必须处于可用状态,所以务必全面检查。
第二步是检查资源的完整*,从最低的可用*等级开始向上检查。服务器是否成功引导?系统启动时是否出现故障,如带有数字 552、554、或 556的 LED消息(毁坏的文件系统、JFS或 Object Data Manager [ODM])?如果系统仍在正常运行,那么执行 cfgmgr命令后,磁盘资源是否会重新联机并回到 *ailable状态?卷组是否可由 varyonvg命令激活?文件系统是否完全载入?想要查看的数据是否能出现在文件系统内,还是丢失了?
第三步是按具体情况具体分析的方式解决资源问题。以下是我在多年的修复问题过程中常常使用的一些技巧:
文件系统。以我的经验,这是最常见的一种磁盘错误。无需多费劲就可以让超块变脏、造成存储碎片、搞乱存储节点或引起 errpt反复出现 JFS错误。即便是一个完整的文件系统也可能会把事情搞砸。修复文件系统问题最好的策略也是最简单的:利用文件系统检查命令(fsck)。在这些情况下,我会卸载文件系统并针对它们运行 fsck–y,直至不再出现错误,然后再重新载入它们。有时,我会格外彻底地卸载一个卷组内所有的文件系统,并使用外壳脚本中的循环脚本来完成此项任务以防出现潜在问题。
卷组。问题若超出了文件系统的范畴时,通常会转向卷组级别。有时,问题是 ODM级的,可以通过 syncvg或 synclvodm进行纠正。在紧要关头,我曾用 varyoffvg关闭卷组,用 exportvg导出它们,然后用 importvg重新导入它们以使其能被正确识别。但我总是会提前备份好/etc/filesystems文件并记录下磁盘端口 VLAN ID(PVID)以保存载入的顺序。
物理卷。谈到 PVID,我看到过磁盘丢失,然后再以不同的 PVID重新回到服务器。一个有帮助的做法是定期在别处记录下磁盘信息作为比照以防这类事情发生。如果真的发生了,我通常会用 rmdev–dl从服务器删除这些磁盘,再用 cfgmgr重新检测它们,然后再导出并重新导入卷组。
SAN连接。有时全局名称(WWN)并不跨 SAN网络进行端对端的传播,比如 VIO服务器上的 NPIV。我有时会通过运行 pcmpath set adapter offline禁用光纤通道适配器并手动定义或检查 WWN,然后再重新开启适配器。我也做过最极端的事,就是探查电缆并检查另一端是否有灯亮以确保没有物理问题存在。
引导问题。如果想要判断一个服务器为何在磁盘故障后不能引导,我通常会做的第一件事情是从服务器(根卷组除外),断开所有磁盘的映射和连接。如果为了找到一两个 rootvg磁盘而探查数百个磁盘,那么将花去 Software Management System(SMS)大量的时间。因此,我会在维护模式从一个 NIM服务器引导系统来运行诊断并修复文件系统,用 bosboot命令重新创建引导逻辑卷或访问此根卷组来修复诸如/etc/filesystems的配置文件。而且,在服务器启动后,有问题的文件系统通常都是那些本身处于关闭状态而它们旁边其他的文件系统则载入正常的文件系统。
恢复。最后,如果有东西损坏并确实需要修复,就要确保新更换的部件尽量接近于原始设备。这样一来,就可以最大限制地减少处理像文件系统大小或软件驱动器这类占用修复时间的操作。我一直建议要为做好系统备份(mksysb映像和使用诸如 IBM Tivoli® Storage Manager的产品)来应对数据丢失和无法恢复的最坏情况。
二、放映机服务器bgs是什么
1传输控制协议端口服务多路开关选择器
2 press管理实用程序
3压缩进程
5远程作业登录
7回显(Echo)
9丢弃
11在线用户
12我的测试端口
13时间
15 stat
17每日引用
18消息发送协议
19字符发生器
20文件传输协议(默认数据口)
21文件传输协议(控制)
22 SSH远程登录协议
23 tel终端仿真协议
24预留给个人用邮件系统
25 smtp简单邮件发送协议
27 NSW用户系统现场工程师
29 MSGICP
31 MSG验证
33显示支持协议
35预留给个人打印机服务
37时间
38路由访问协议
39资源定位协议
41图形
42 WINS主机名服务
43"绰号" who is服务
44 MPM(消息处理模块)标志协议
45消息处理模块
46消息处理模块(默认发送口)
47 NI FTP
48数码音频后台服务
49 TACACS登录主机协议
50远程邮件检查协议
51 IMP(接口信息处理机)逻辑维
52施乐网络服务系统时间协议
53域名服务器
54施乐网络服务系统票据*
55 ISI图形语言
56施乐网络服务系统验证
57预留个人用终端访问
58施乐网络服务系统邮件
59预留个人文件服务
60未定义
61 NI邮件?
62异步通讯适配器服务
63 WHOIS+
64通讯接口
65 TACACS数据库服务
66 Oracle SQL*NET
67引导程序协议服务端
68引导程序协议客户端
69小型文件传输协议
70信息检索协议
71远程作业服务
72远程作业服务
73远程作业服务
74远程作业服务
75预留给个人拨出服务
76分布式外部对象存储
77预留给个人远程作业输入服务
78修正TCP
79 Finger(查询远程主机在线用户等信息)
80全球信息网超文本传输协议()
81 HOST2名称服务
82传输实用程序
83模块化智能终端ML设备
84公用追踪设备
85模块化智能终端ML设备
86 Micro Focus Cobol编程语言
87预留给个人终端连接
88 Kerberros安全认证系统
89 SU/MIT终端仿真网关
90 DNSIX安全属*标记图
91 MIT Dover假脱机
92网络打印协议
93设备控制协议
94 Tivoli对象调度
95 SUPDUP
96 DIXIE协议规范
97快速远程虚拟文件协议
98 TAC(东京大学自动计算机)新闻协议
99 Tel服务,开99端口(Troj.open99)
101 usually from sri-nic
102 iso-tsap
103 gppitnp
104 acr-nema
105 cs-ns
106 3-tsmux
107 rtel
108 snagas
109 Post Office
110 Pop3服务器(邮箱发送服务器)
111 sunrpc
112 mcidas
113身份查询
114 audionews
115 sftp
116 ansanotify
117 path或 uucp-path
118 sqlserv
119新闻服务器
120 cfdptkt
121 BO jammerkillah
123 work
124 ansatrader
125 locus-map
126 unitary
127 locus-con
128 gss-xlicen
129 pwdgen
130 cisco-fna
131 cisco-tna
132 cisco-sys
133 statsrv
134 ingres-
135查询服务 DNS
136 profile PROFILE Naming System
137 NetBIOS数据报(UDP)
138 NetBios-DGN
139共享资源端口(NetBios-SSN)
140 emfis-data
141 emfis-tl
142 bl-idm
143 IMAP电子邮件
144 NeWS
145 uaac
146 iso-tp0
147 iso-ip
148 jargon
149 aed-512
150 sql-
151 hems
152 bftp
153 sgmp
154 sc-prod
155 sc-dev
156 sqlsrv
157 k-cmp
158 PCMAIL
159 nss-routing
160 sgmp-traps
161远程管理设备(SNMP)
162 snmp-trap
163 cmip-man
164 cmip-agent
165 xns-courier Xerox
166 s-
167 namp
168 rsvd
169 send
170 work Po
171 multiplex Network
172 cl/1 Network
173 xyplex-mux
174 mailq
175 vm
176 genrad-mux
177 xdmcp
178 nextstep
179 bgp
180 ris
181 unify
182 audit
183 ocbinder
184 ocserver
185 remote-kis
186 kis
187 aci
188 mumps
189 qft
190 gacp
191 prospero
192 osu-nms
193 srmp
194 Irc
195 dn6-nlm-aud
196 dn6-smm-red
197 dls
198 dls-mon
199 smux
200 src IBM
201 at-rtmp
202 at-nbp
203 at-3
204 at-echo
205 at-5
206 at-zis
207 at-7
208 at-8
209 qmtp
210 z39.50 ANSI
211 914c/g
212 a
214 vmpwscs
215 softpc Insignia Solutions
216 CAIlic
217 dbase
218 mpp
219 uarps
220 imap3
221 fln-s*
222 rsh-s*
223 cdc
242 direct
243 sur-meas
244 dayna
245 link
246 dsp3270
247 subntbcst_tftp
248 bhfhs
256 rap
257 set
258 yak-chat
259 esro-gen
260 openport
263 hdap
264 bgmp
280 -mgmt
309 entrusttime
310 bhmds
312 vslmp
315 load
316 decauth
317 zan
321 pip
344 pdap
345 pawserv
346 zserv
347 fatserv
348 csi-sgwp
349 mftp
351 matip-type-b
351 matip-type-b
353 ndsauth
354 bh611
357 bhevent
362 srssend
365 dtk
366 odmr
368 qbikgdp
371 clearcase
372 ulistproc ListProcessor
373 legent-1
374 legent-2
374 legent-2
375 hassle
376 nip
377 tnETOS
378 dsETOS
379 is99c
380 is99s
381 hp-collector
383 hp-alarm-mgr
384 arns
385 ibm-
386 asa
387 aurp
388 unidata-ldm
389 ldap
390 uis
391 synotics-relay
393 dis
394 embl-ndt
395 cp
396 ware-ip
397 mptn
398 kryptolan
399 iso-tsap-c2
vm0
401 ups Uninterruptible Power Supply
402 genie Genie Protocol
403 decap
404 nced
405 ncld
406 imsp
407 timbuktu
408 prm-sm
409 prm-nm
410 decladebug DECLadebug Remote Debug Protocol
411 rmt
412 synoptics-trap
413 smsp SMSP
414 infoseek
415 b
416 silverplatter
417 onmux
418 hyper-g
419 ariel1
420 smpte
421 ariel2
422 ariel3
423 opc-job-start
424 opc-job-track
425 icad-el
426 smartsdp
427 svrloc
428 ocs_cmu
429 ocs_amu
430 utmpsd
431 utmpcd
432 iasd
433 nnsp
434 mobileip-agent
435 mobilip-mn
436 dna-cml
437 scm
438 dsfgw
439 dasp
440 sgcp
441 decvms-sysmgt
442 cvc_hostd
443安全服务
444 snpp
445 NT的共享资源新端口(139)
446 ddm-rdb
447 ddm-dfm
448 ddm-ssl
449 as-servermap
450 tserver
451 sfs-smp-
453 creativeserver
454 contentserver
455 creativepartnr
456 Hackers
457 scohelp
458 leqtc
459 ampr-rcmd
460 skronk
461 datasurfsrv
462 datasurfsrvsec
463 alpes
464 kpasswd
465 smtps
466 digital-vrc
467 mylex-mapd
468 photuris
469 rcp
470 scx-proxy
471 mondex
472 ljk-login
473 hybrid-pop
474 tn-tl-w1
475 tcphaspsrv
476 tn-tl-fd1
477 ss7ns
478 spsc
479 iafserver
480 iafdbase
481 ph Ph
482 bgs-nsi
483 ulp
484 integra-sme
485 powerburst Air Soft Power Burst
486 *ian
487 saft
488 gss-
489 nest-protocol
490 mi-pfs
491 go-login
492 ticf-1
493 ticf-2
494 pov-ray
495 intecourier
496 pim-rp-disc
497 dantz
498 siam
499 iso-ill
500 sytek
501 stmf
502 asa-l-proto
503 intrinsa
504 citadel
505 mailbox-lm
506 ohimsrv
507 crs
508 xvttp
509 snare
510 fcp
511 passgo
512 exec
513 login
514 shell
515 printer
516 videotex
517 talk
518 ntalk
519 utime
520 efs
521 ripng
522 ulp
523 ibm-db2
524 ncp NCP
525 timed
526 tempo newdate
527 stx
528 custix
529 irc-serv
530 courier
531 conference chat
532 news
533 wall
534 mm-admin
535 iiop
536 opalis-rdv
537 nmsp
538 gdomap
539 apertus-ldp
540 uucp
541 uucp-rlogin
542 merce
543 klogin
544 kshell
545 leqtcsrvr
546 dhcpv6-client
547 dhcpv6-server
548 afpovertcp
549 idfp
550 new-rwho
551 cybercash
552 deviceshare
553 pirp
554 rtsp
555 dsf
556 remotefs
557 openvms-sysipc
558 sdnskmp
559 teedtap
560 rmonitor
561 monitor
562 chshell chcmd
563 nntps
564 9pfs
565 whoami
566 streettalk
567 banyan-rpc
568 ms-shuttle
569 ms-rome
570 meter
571 meter
572 sonar
573 banyan-
574 ftp-agent
575 vemmi
576 ipcd
577 vnas
578 ipdd
579 decbsrv
581 bdp
588 cal
589 eyelink
590 tns-cml
593 -rpc-epmap
594 tpip
596 smsd
599 acp Aeolon Core Protocol
600 ipcserver Sun IPC server
606 urm Cray
607 nqs
608 sift-uft
609 npmp-trap
610 npmp-local
611 npmp-gui
613 hmmp-op
620 sco-websrvrmgr
621 escp-ip
625 dec_dlm
626 asia
628 qmqp
630 rda
631 ipp
632 bmpp
634 ginad
635 rlzdbase
636 ldaps
637 lanserver
639 msdp
666 doom
667 disclose
668 mem
669 meregister
670 vacdsm-sws
671 vacdsm-
672 vpps-qua
673 cimplex
674 acap
675 dctp
704 elcsd
705 agentx
709 entrust-kmsh
710 entrust-ash
729 viewdm1
730 viewdm2
731 viewdm3
741 gw
742 rcs
744 flexlm
747 fujitsu-dev
748 ris-cm
749 kerberos-adm
750 rfile
751 pump
752 qrh
753 rrh
754 tell send
758 nlogin
759 con
760 ns
761 rxe
762 quotad
763 cycleserv
764 omserv
765 webster
769 vid
770 cadlock
771 rtip
772 cycleserv2
773 submit
774 rpasswd
776 wpages
780 wpgs
786 concert Concert
787 qsc QSC
801 device
873 rsync rsync
886 iclc-locate
887 iclc_svinfo
888 erlogin
900 omginitialrefs
911 xact-backup
990 ftps
991 nas
992 tels
993 imaps
994 ircs
995 pop3s
996 vsi
997 maitrd
998 busboy
999 garcon
1000 cadlock
1010 surf
1023 Reserved
1024 NetSpy.698(YAI)
1025 work blackjack
1026 Win2000的 Inter信息服务
1031 iad2
1032 iad3
1033 Netspy
1042 Bla1.1
1047 GateCrasher
1080 Wingate
1058 nim
1059 nimreg
三、...但在本地服务列表中看不到,任务管理器的服务器中可以看到
(1)不用登陆进系统即可运行.
(2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.
笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.
运行Delphi7,选择菜单File-->New-->Other--->Service Application.将生成一个服务程序的框架.将工程保存为ServiceDemo.dpr和Unit_Main.pas,然后回到主框架.我们注意到,Service有几个属*.其中以下几个是我们比较常用的:
(1)DisplayName:服务的显示名称
(2)Name:服务名称.
我们在这里将DisplayName的值改为"Delphi服务演示程序",Name改为"DelphiService".编译这个项目,将得到ServiceDemo.exe.这已经是一个服务程序了!进入CMD模式,切换致工程所在目录,运行命令"ServiceDemo.exe/install",将提示服务安装成功!然后" start DelphiService"将启动这个服务.进入控制面版-->管理工具-->服务,将显示这个服务和当前状态.不过这个服务现在什么也干不了,因为我们还没有写代码:)先" stop DelphiService"停止再"ServiceDemo.exe/uninstall"删除这个服务.回到Delphi7的IDE.
我们的计划是为这个服务添加一个主窗口,运行后任务栏显示程序的图标,双击图标将显示主窗口,上面有一个按钮,该按钮将实现Ctrl+Alt+Del功能.
实际上,服务程序莫认是工作于Winlogon桌面的,可以打开控制面板,查看我们刚才那个服务的属*-->登陆,其中"允许服务与桌面交互"是不打钩的.怎么办?呵呵,回到IDE,注意那个布尔属*:Interactive,当这个属*为True的时候,该服务程序就可以与桌面交互了.
File-->New-->Form为服务添加窗口FrmMain,单元保存为Unit_FrmMain,并且把这个窗口设置为手工创建.完成后的代码如下:
unit Unit_Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, Unit_FrmMain;
type
TDelphiService= class(TService)
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceShutdown(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
{ Private declarations}
public
function GetServiceController: TServiceController; override;
{ Public declarations}
end;
var
DelphiService: TDelphiService;
FrmMain: TFrmMain;
implementation
{$R*.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
DelphiService.Controller(CtrlCode);
end;
function TDelphiService.GetServiceController: TServiceController;
begin
Result:= ServiceController;
end;
procedure TDelphiService.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
while not Terminated do
begin
Sleep(10);
ServiceThread.ProcessRequests(False);
end;
end;
procedure TDelphiService.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
Sleep(10);
ServiceThread.ProcessRequests(False);
end;
end;
procedure TDelphiService.ServicePause(Sender: TService;
var Paused: Boolean);
begin
Paused:= True;
end;
procedure TDelphiService.ServiceShutdown(Sender: TService);
begin
gbCanClose:= true;
FrmMain.Free;
Status:= csStopped;
ReportStatus();
end;
procedure TDelphiService.ServiceStart(Sender: TService;
var Started: Boolean);
begin
Started:= True;
Svcmgr.Application.CreateForm(TFrmMain, FrmMain);
gbCanClose:= False;
FrmMain.Hide;
end;
procedure TDelphiService.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
Stopped:= True;
gbCanClose:= True;
FrmMain.Free;
end;
end.
主窗口单元如下:
unit Unit_FrmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, ShellApi, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
const
WM_TrayIcon= WM_USER+ 1234;
type
TFrmMain= class(TForm)
Timer1: TTimer;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations}
IconData: TNotifyIconData;
procedure AddIconToTray;
procedure DelIconFromTray;
procedure TrayIconMessage(var Msg: TMessage); message WM_TrayIcon;
procedure SysButtonMsg(var Msg: TMessage); message WM_SYSCOMMAND;
public
{ Public declarations}
end;
var
FrmMain: TFrmMain;
gbCanClose: Boolean;
implementation
{$R*.dfm}
procedure TFrmMain.FormCreate(Sender: TObject);
begin
FormStyle:= fsStayOnTop;{窗口最前}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);{不在任务栏显示}
gbCanClose:= False;
Timer1.Interval:= 1000;
Timer1.Enabled:= True;
end;
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= gbCanClose;
if not CanClose then
begin
Hide;
end;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
Timer1.Enabled:= False;
DelIconFromTray;
end;
procedure TFrmMain.AddIconToTray;
begin
ZeroMemory(@IconData, SizeOf(TNotifyIconData));
IconData.cbSize:= SizeOf(TNotifyIconData);
IconData.Wnd:= Handle;
IconData.uID:= 1;
IconData.uFlags:= NIF_MESSAGE or NIF_ICON or NIF_TIP;
IconData.uCallbackMessage:= WM_TrayIcon;
IconData.hIcon:= Application.Icon.Handle;
IconData.szTip:='Delphi服务演示程序';
Shell_NotifyIcon(NIM_ADD,@IconData);
end;
procedure TFrmMain.DelIconFromTray;
begin
Shell_NotifyIcon(NIM_DELETE,@IconData);
end;
procedure TFrmMain.SysButtonMsg(var Msg: TMessage);
begin
if(Msg.wParam= SC_CLOSE) or
(Msg.wParam= SC_MINIMIZE) then Hide
else inherited;//执行默认动作
end;
procedure TFrmMain.TrayIconMessage(var Msg: TMessage);
begin
if(Msg.LParam= WM_LBUTTONDBLCLK) then Show();
end;
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
AddIconToTray;
end;
procedure SendHokKey;stdcall;
var
HDesk_WL: HDESK;
begin
HDesk_WL:= OpenDesktop('Winlogon', 0, False, DESKTOP_JOURNALPLAYBACK);
if(HDesk_WL<> 0) then
if(SetThreadDesktop(HDesk_WL)= True) then
PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT or MOD_CONTROL, VK_DELETE));
end;
procedure TFrmMain.Button1Click(Sender: TObject);
var
dwThreadID: DWORD;
begin
CreateThread(nil, 0,@SendHokKey, nil, 0, dwThreadID);
end;
end.
补充:
(1)关于更多服务程序的演示程序,请访问以下Url:,上面包含了多个演示如何控制和管理系统服务的代码.
(2)请切记:Windows实际上存在多个桌面.例如屏幕传输会出现白屏,可能有两个原因:一是系统处于锁定或未登陆桌面,二是处于屏幕保护桌面.这时候要将当前桌面切换到该桌面才能抓屏.
(3)关于服务程序与桌面交互,还有种动态切换方法.大概单元如下:
unit ServiceDesktop;
interface
function InitServiceDesktop: boolean;
procedure DoneServiceDeskTop;
implementation
uses Windows, SysUtils;
const
DefaultWindowStation='WinSta0';
DefaultDesktop='Default';
var
hwinstaS*e: HWINSTA;
hdeskS*e: HDESK;
hwinstaUser: HWINSTA;
hdeskUser: HDESK;
function InitServiceDesktop: boolean;
var
dwThreadId: DWORD;
begin
dwThreadId:= GetCurrentThreadID;
// Ensure connection to service window station and desktop, and
// s*e their handles.
hwinstaS*e:= GetProcessWindowStation;
hdeskS*e:= GetThreadDesktop(dwThreadId);
hwinstaUser:= OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED);
if hwinstaUser= 0 then
begin
OutputDebugString(PChar('OpenWindowStation failed'+ SysErrorMessage(GetLastError)));
Result:= false;
exit;
end;
if not SetProcessWindowStation(hwinstaUser) then
begin
OutputDebugString('SetProcessWindowStation failed');
Result:= false;
exit;
end;
hdeskUser:= OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED);
if hdeskUser= 0 then
begin
OutputDebugString('OpenDesktop failed');
SetProcessWindowStation(hwinstaS*e);
CloseWindowStation(hwinstaUser);
Result:= false;
exit;
end;
Result:= SetThreadDesktop(hdeskUser);
if not Result then
OutputDebugString(PChar('SetThreadDesktop'+ SysErrorMessage(GetLastError)));
end;
procedure DoneServiceDeskTop;
begin
// Restore window station and desktop.
SetThreadDesktop(hdeskS*e);
SetProcessWindowStation(hwinstaS*e);
if hwinstaUser<> 0 then
CloseWindowStation(hwinstaUser);
if hdeskUser<> 0 then
CloseDesktop(hdeskUser);
end;
initialization
InitServiceDesktop;
finalization
DoneServiceDesktop;
end.
更详细的演示代码请参看:
(4)关于安装服务如何添加服务描述.有两种方法:一是修改注册表.服务的详细信息都位于HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\下面,例如我们刚才那个服务就位于HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\DelphiService下.第二种方法就是先用QueryServiceConfig2函数获取服务信息,然后ChangeServiceConfig2来改变描述.用Delphi实现的话,单元如下:
unit WinSvcEx;
interface
uses Windows, WinSvc;
const
//
// Service config info levels
//
SERVICE_CONFIG_DESCRIPTION= 1;
SERVICE_CONFIG_FAILURE_ACTIONS= 2;
//
// DLL name of imported functions
//
AdvApiDLL='advapi32.dll';
type
//
// Service description string
//
PServiceDescriptionA= ^TServiceDescriptionA;
PServiceDescriptionW= ^TServiceDescriptionW;
PServiceDescription= PServiceDescriptionA;
{$EXTERNALSYM _SERVICE_DESCRIPTIONA}
_SERVICE_DESCRIPTIONA= record
lpDescription: PAnsiChar;