澳门网络娱乐游戏平台-澳门电子游戏娱乐网址-官方直营

澳门网址赌场正规网址Python 写Windows Service服务程序,pythonservice

本文讲的的Windows情况下exe可施行文件的周转原理,那之中涉及的知识超级多,须求读者对Windows操作系统、Windows编程等具有明白。本文试图以老妪能解的语言描述,让越来越多的人看的懂,从运营原理上对前后相继的运行有个好的打听。文章布置地点,小编那边是以我们都懂的main/WinMain函数执行前,实践时,实施后分为多个部分:exe程序的早先化;主函数的运营进度;程序收尾专业PS:本身的本事也是个其余,文章中难免会有不当脱漏之处,还请各位高手商议指正,多谢由于小说较长,请到以下链接下载PDF文件查看

Python 写Windows 瑟维斯服务程序,pythonservice

 

1.需求

怎么要支付二个windows服务啊?在此以前做一个程序,应当要读取钦点目录文件License, 因为其它程序也在读取那钦命目录的License文件,且License不一致一时候会校正License的内容,
纠正了License后形成大家的程序不大概运转,所以想做个windows 的劳动时时检查评定那一个License文件是或不是被改换,假使检查测量检验到被涂改就覆盖该License。

澳门网址赌场正规网址Python 写Windows Service服务程序,pythonservice。 

2.凭仗的第三方库

总得要依靠第三方模块pywin32
下载地址:

 

3.得以完毕进程

实例化win32serviceutil.ServiceFramework的时候,windows系统会自动调用SvcDoRun方法,
其生龙活虎函数的进行不得以终结,因为结束就代表服务截至。所以当大家放自个儿的代码在SvcDoRun函数中实施的时候,必得保证该函数不脱离,雷同与那样的功效:

1 def SvcDoRun(self):
2        while True:
3             self._LicenseExist()
4             time.sleep(2)

当结束服务的时候,系统会调用SvcDoStop函数,该函数通过设置标记位等方法让SvcDoRun函数退出,正是健康的终止服务。
win32event.SetEvent(self.hWaitStopState of Qatar 通过事件淡出

劳动操作命令:

 1 #1.安装服务
 2 
 3 python PythonService.py install
 4 
 5 #2.让服务自动启动
 6 
 7 python PythonService.py --startup auto install 
 8 
 9 #3.启动服务
10 
11 python PythonService.py start
12 
13 #4.重启服务
14 
15 python PythonService.py restart
16 
17 #5.停止服务
18 
19 python PythonService.py stop
20 
21 #6.删除/卸载服务
22 
23 python PythonService.py remove

 

4.完璧归赵代码:

 1 # -*- coding: UTF8 -*-
 2 # 
 3 import win32serviceutil 
 4 import win32service 
 5 import win32event
 6 import winerror
 7 import servicemanager
 8 import os, sys, time
 9 
10 class PythonService(win32serviceutil.ServiceFramework): 
11 
12     _svc_name_ = "ALicense"   #  服务名
13     _svc_display_name_ = "ALicense Is Exist "   # 服务在windows系统中显示的名称
14     _svc_description_ = "ALicense  Is Exist License windows"   #服务的描述
15 
16     def __init__(self, args): 
17         win32serviceutil.ServiceFramework.__init__(self, args) 
18         self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
19         self.License = self._LicenseExist()
20         self.run = True
21         
22     def _LicenseExist(self):
23         is_exist=os.path.exists('C:License.dat')
24         string_key='d8838bccad0c19e847b9e73f4432b951b6f035fd8c19f5474e30db5a0e4fa4c99b57c01af79161850b95d3f99a6b0b6074f18224ec7c44f28bc243be06f8f2b96e370f5ca724c01f1bd0e289afdd9eeef7e33d42a5113ddd4818a47b33449487baec2099a50d5e3dde32bdf66d979982a68d0d60a1200990ebf8a4827b7db3d1e83f9ad9d9946267fe830c48bbe025a5ebb99b85c7f1cf93de2beb22c8e9766e5ef526242b01f5251d8a768780026add2d2d8fb9ffccb86f8779221b01d206e586d96b83839b30006910a4bca6438fb5d5b2900431f8ecab50a9f18d0e7e8abec7b212fdc9ab667f08dd3eef14ecbdb24910466f45be92d0a085ff81d7362b828847c29be579942b63b9eb26b2441b5ef20f5a012431d263ded3f5fe434111b833612464bf4df18ae06c536b6895d240387774c3b438d5f0745c7a0d3ce963e82fc8df603f6fa526e8bd1fc51e2509e0840f3bbbde7bc3fec9e837b5aa744a9ae4449c974e26d787e475f73dbc3ee9c73cc258f38b79c413453fd4fe732bed57ba9d0312d2bcaf333a5c82d92a269a7ccaf27273a178feb95028f8f0805675a6199abbd8b47756b4543269a35025438794cd32410ac19c77526c4b94b93d091069056df1dda0f49298d753a317850c7104f94067ac9cc4d5b3d377f10627d21c12a4c066347eb05370fbe9e0658c1ec1803d43ed71509f5cdb25d60f505ef7527c405d3ea05bb381436dd3622484a1ff7263e4d93f275493332af3f77d28a13a0fa0eb810b7d25a378f6b8313ab3bcb44131ca3500670b0321aa95b077cef85d348e13315c2d2d42795e41569162986755709d099b59ee320e6caf422497234251d07d697bb3f3e5ad6d15d80fd85da016e7075bf84522aa6339e8b66ecd4b71d02fd01f4f57a0147ceaddbf9e5f32e7ec60ae35ff73d2f386d9d0133cb697731773b55fc2615c584e9f4013253d3fc53fa13a9e982a2493e1145861759c30cf9064d333bb184e378b52e7dd8bbbd0c17774549fabb44014dab2e0a903c53d0da1c9d3a223c69f3b9bcc7925ba21a464fc9fa43e20574ffedb7a27f2cd7ae7b6b46c5cb4e0b176ece7d59ff199b74b3436ead185df5c79d74b35d644bb02315130131772db21fcd1d535014b10c4cbbb8e1f847cd00be52992ab94a7b5a7b1c27d87abe3fc605972ceb3463a07924c816a04642adcabbc7b18a40a24a3af217d0390c1102cb5b4573b1816c76667f50d33631a97e986255644e8e0c26d63cd1f29f501ff51673509822c1bf8158ceee752024dcbe0e24941803ebd8afc0bded3598012ba5431060f0db7fad7fd4960972da9a6cfaa0850c43470498236ef7b22fbf79d491e054cf142815e6c04e573a52e22ccaa2d406167c6442db40456cd93752349b2968132388b51edbe13aa349abc34696453d1a4b39f8311284f8afbae'
25         if is_exist:
26             for line in open("C:License.dat"):
27                 if line!=string_key:
28                     self.writer(string_key)
29         else:
30             self.writer(string_key)
31     # 写入License        
32     def writer(self, string_key):
33         f=open('C:License.dat','w')
34         f.write(string_key)
35         f.close()
36         
37     def SvcDoRun(self):
38         while self.run:
39             # 已经运行
40             self._LicenseExist()
41             time.sleep(2)   #推迟调用线程的运行2秒
42                 
43     def SvcStop(self): 
44         # 服务已经停止
45         self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
46         win32event.SetEvent(self.hWaitStop) 
47         self.run = False
48 
49 if __name__=='__main__':
50     if len(sys.argv) == 1:
51         try:
52             evtsrc_dll = os.path.abspath(servicemanager.__file__)
53             servicemanager.PrepareToHostSingle(PythonService)
54             servicemanager.Initialize('PythonService', evtsrc_dll)
55             servicemanager.StartServiceCtrlDispatcher()
56         except win32service.error, details:
57             if details[0] == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
58                 win32serviceutil.usage()
59     else:
60         win32serviceutil.HandleCommandLine(PythonService)

 

5.效益与主题材料

当间接运维py文件访问是足以增进期服用务,且服务也可运营,不过利用pyinstaller打包exe后前后相继就不能够健康执行,
晋升:错误1053 服务未有立刻相应运营或决定需要

澳门网址赌场正规网址 1

google 后找到清除措施,
原理笔者亦不是很懂,貌似是要在实例化windows服务类时候,监察和控制服务调整

 1     if len(sys.argv) == 1:
 2         try:
 3             evtsrc_dll = os.path.abspath(servicemanager.__file__)
 4             servicemanager.PrepareToHostSingle(PythonService)
 5             servicemanager.Initialize('PythonService', evtsrc_dll)
 6             servicemanager.StartServiceCtrlDispatcher()
 7         except win32service.error, details:
 8             if details[0] == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
 9                 win32serviceutil.usage()
10     else:
11         win32serviceutil.HandleCommandLine(PythonService)

pyinstaller 打包为调节台文件

1 if __name__ == '__main__':
2     from PyInstaller.main import run
3     params=['windows_services_in_python.py', '-F', '-c', '--icon=favicon.ico']
4     run(params)

打包后CMD到改目录:

澳门网址赌场正规网址 2

放行杀毒软件拦截

澳门网址赌场正规网址 3

 澳门网址赌场正规网址 4

 

6.管理window服务操作

风度翩翩体化代码:

  1 #!/usr/bin/env python
  2 # -*- coding: UTF8 -*-
  3 #
  4 import win32service
  5 import win32con
  6 import time, sys
  7 import datetime
  8 reload(sys)
  9 sys.setdefaultencoding("utf8")
 10 class ServiceManager(object):
 11     """管理window服务"""
 12 
 13     def __init__(self, name):
 14         """
 15         name: 服务的名称
 16         """
 17         self.name = name
 18         
 19         #启动或停止服务时等待操作成功等待时间
 20         self.wait_time = 0.5
 21         #启动或停止服务时最大等待时间,超过时返回超时提示
 22         self.delay_time = 10
 23         self.scm = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS)
 24 
 25 
 26         if self.is_exists():
 27             try:
 28                 self.handle = win32service.OpenService(self.scm, self.name, win32service.SC_MANAGER_ALL_ACCESS)
 29             except Exception, e:
 30                 self.log(e)
 31         else:
 32             print '服务 %s 没有安装'.encode('gbk') % self.name
 33             
 34 
 35     def is_stop(self):
 36         """检查服务是否停止"""
 37         flag = False
 38         try:
 39             if self.handle:
 40                 ret = win32service.QueryServiceStatus(self.handle)
 41                 flag = ret[1] != win32service.SERVICE_RUNNING
 42         except Exception, e:
 43             self.log(e)
 44         return flag
 45 
 46     def start(self):
 47         """开启服务"""
 48         try:
 49             if self.handle:
 50                 win32service.StartService(self.handle, None)
 51         except Exception, e:
 52             self.log(e)
 53         status_info = win32service.QueryServiceStatus(self.handle)
 54 
 55         if status_info[1] == win32service.SERVICE_RUNNING:
 56             return '启动服务%s成功'.encode('gbk') % self.name
 57         elif status_info[1] == win32service.SERVICE_START_PENDING:
 58             #如果服务正在启动中则延迟返回启动信息,直到启动成功,或返回启动时间过长信息
 59             start_time = datetime.datetime.now()
 60             while True:
 61                 if (datetime.datetime.now() - start_time).seconds > self.delay_time:
 62                     return '启动服务%s时间太长'.encode('gbk') % self.name
 63 
 64                 time.sleep(self.wait_time)
 65                 if win32service.QueryServiceStatus(self.handle)[1] == win32service.SERVICE_RUNNING:
 66                     return '启动服务%s成功'.encode('gbk') % self.name
 67         else:
 68             return '启动服务%s失败'.encode('gbk') % self.name
 69 
 70     def stop(self):
 71         """停止服务"""
 72         try:
 73             status_info = win32service.ControlService(self.handle, win32service.SERVICE_CONTROL_STOP)
 74         except Exception, e:
 75             self.log(e)
 76         if status_info[1] == win32service.SERVICE_STOPPED:
 77             return '停止服务%s成功'.encode('gbk') % self.name
 78         elif status_info[1] == win32service.SERVICE_STOP_PENDING:
 79             start_time = datetime.datetime.now()
 80             while True:
 81                 if (datetime.datetime.now() - start_time).seconds > self.delay_time:
 82                     return '停止服务%s时间太长'.encode('gbk') % self.name
 83 
 84                 time.sleep(self.wait_time)
 85                 if win32service.QueryServiceStatus(self.handle)[1] == win32service.SERVICE_STOPPED:
 86                     return '停止服务%s成功'.encode('gbk') % self.name
 87         else:
 88             return '停止服务%s失败'.encode('gbk') % self.name
 89 
 90     def restart(self):
 91         """重启服务"""
 92         if not self.is_stop():
 93             self.stop()
 94         self.start()
 95         return win32service.QueryServiceStatus(self.handle)
 96 
 97     def status(self):
 98         """获取运行的状态"""
 99         try:
100             status_info = win32service.QueryServiceStatus(self.handle)
101             status = status_info[1]
102             if status == win32service.SERVICE_STOPPED:
103                 return "STOPPED"
104             elif status == win32service.SERVICE_START_PENDING:
105                 return "STARTING"
106             elif status == win32service.SERVICE_STOP_PENDING:
107                 return "STOPPING"
108             elif status == win32service.SERVICE_RUNNING:
109                 return "RUNNING"
110         except Exception, e:
111             self.log(e)
112 
113     def close(self):
114         """释放资源"""
115         try:
116             if self.scm:
117                 win32service.CloseServiceHandle(self.handle)
118                 win32service.CloseServiceHandle(self.scm)
119         except Exception, e:
120             self.log(e)
121 
122     def is_exists(self):
123         """windows服务是否已安装"""
124         statuses = win32service.EnumServicesStatus(self.scm, win32service.SERVICE_WIN32, win32service.SERVICE_STATE_ALL)
125         for (short_name, desc, status) in statuses:
126             if short_name == self.name:
127                 return True
128         return False
129 
130     def log(self, exception):
131         
132         print(exception)
133         
134         
135 
136 if __name__=='__main__':
137 
138     app= ServiceManager('AAaservice')
139     msg= app.is_exists()  # 判断是否安装  (以下操作必须先判断服务是否存在)
140     #msg= app.is_stop()  # 判断服务是否停止
141     #msg= app.status()  # 查看服务的状态
142     #msg= app.start()  # 开启服务
143     #msg= app.stop()  # 暂停服务   (服务开启才能停止,else error)
144     #msg= app.restart()  # 重启服务
145     
146     print(msg)

 

 

7.参照他事他说加以调查地址:

python增多服务:        
python增多劳动:        
卷入十分小概运维服务:        
python管理window服务  

 

写Windows Service服务程序,pythonservice 1.须求为啥要开销三个windows服务啊?从前做三个顺序,必必要读取钦命目录文件License, 因为其...

作品目录:

                 

1. 引子:

2. Native Application Demo 展示:

3. Native Application 简介:

4. Native Application 有啥妙用:

5. MJ0011 关于 Native Application 的稿子收拾:

6. 网络络别的关于 Native Application 的随笔收拾:

7. 小结:

                

1. 引子:

                         

实际上在长久在此早先就看了 MJ0011 翻译的十一分《Native 应用程序详细》类别的稿子,

(PS: MJ0011 为 360 的上位手艺履行官,本事是没的说,可是貌似某些放肆之说 ~ )

还要看完后对那生龙活虎多种随笔也很感兴趣的,所以又去 Google 上找了多少个小质感学习了须臾间,

而那篇小说呢,则是将本身前阵子的所谓的上学给总括出来也顺路给公众分享一下。

尽管这里是说的下结论 Native Application,但最初现身 Native Application 应该是 06 年的事了,

(当然,Native Application 这一个技能是间接存在的,只是在 06 年后有了下边那篇随笔后就不怎么火了点卡塔尔国

其是 Sysinternals 上的后生可畏篇由 Mark Russinovich 发布的篇章《Inside Native Applications》

小说地址如下:http://technet.microsoft.com/en-us/sysinternals/bb897447

而本身却在 2011 年才得以来总括那个技术,所以小编确是归属商量这个东西的落后面一个啊 ~

上面我付出生机勃勃副截图来看一下 Windows 操作系统下的前后相继的花色:

澳门网址赌场正规网址 5

            

在 Windows 最早设计的时候思索到了合作各样系统的应用程序,所以有了情况子系统之说,

此中后生可畏起初的时候思忖到了子系统,POSIX 子系统和 OS/2 子系统,

不过随着历史的迈入,今后也就剩下个 Windows 子系统了,

小编们平常行使的 Windows 操作系统的上层其实也正是指的那几个 Windows 子系统了,

关于这里怎么要扯到 Windows 子系统来说,就看下文介绍了。

无数对象都掌握有 Windows 应用程序和 Windows 内核驱动程序之说,

却很稀有知情在 Windows 中还只怕有 Native Application 一说了,

可是那类程序真的是存在的 ~只不过那类程序行使比较窄,也尚未被很好的加大开来,

本来还会有有些就是Microsoft 自然不期望您随随意便的选拔 Native API。

           

              

2. Native Application Demo 展示:

              

第生龙活虎你须要将下载(博文的末段面附上 德姆o 的下载地址卡塔尔的 EXE 文件拷贝风华正茂份到 system32 目录下,

(博文的 德姆o 只是拿了网络的代码然后自动行使 DDK 编写翻译了而已,德姆o 并不是笔者原创卡塔尔国

下一场再在注册表以下路子中修正BootExecute,

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager

在其间增加 NativeApp_01 Hello World ! 这一个字符串,

澳门网址赌场正规网址 6

                    

澳门网址赌场正规网址 7

          

重启计算机,然后就足以看见上边包车型地铁效应图了(仅在 XP SP3 上进展了测验卡塔尔(قطر‎

澳门网址赌场正规网址 8

              

                   

3. Native Application 简介:

              

何为 Native API ?

Native API 就是您 system32 目录下的百般 ntdll.dll 中所公开的 API(大部分为 UndocumentState of Qatar~

如若读者看过自家近日的《进度隐敝与经过爱护(SSDT Hook 完结卡塔尔(قطر‎》种类小说的话,

言听计行必将会分晓在 Windows 中 kernel32.dll 中的 API 的调用都会由此调换,

也正是跳转到 ntdll.dll 中,而且在 ntdll.dll 中也会有与之相对于的 API 调用,

(譬喻Kernel32.dll 中的 CreateProcess 在 ntdll.dll 中有 NtCreateProcess 与之对应State of Qatar

那么哪些叫做 Native 应用程序呢 ?

上面给出生机勃勃副截图:

澳门网址赌场正规网址 9

            

从上边的截图能够观察,在一同来的 Windows NT 内核中是永葆多少个遇到子系统的,

即 POSIX,WINDOWS,OS/2,那几个子系统归属同大器晚成层,它们共用了 Windows NT 所提供的 API,

即每三个子系统中的 API 的调用都会转移到下一层的相近调用上,

在 Windows 情状子系统(有 Windows,Posix,OS/2State of Qatar中的程序,

都会调用其相对于的子系统下的 API,举例 Windows 子系统中的程序有非常大恐怕会调用 Win32 API CreateProcess,

而 Posix 子系统中的程序也是有望会调用 Posix API CreateProcess(当然有望在 POSIX 下开创进度不是这些名号State of Qatar,

可是毕竟来讲,那三个CreateProcess 的调用都会改造来 Ntdll.dll 中的 NtCreateProcess 中,

也便是地点的多少个子系统最终的调用都会回归到 ntdll.dll 上,

而笔者辈的 Native Application 则是绕过 Windows 子系统,

平昔自个儿调用 Native API,举个例子制造进程来说,小编就不再通过子系统中的神马 CreateProcess 来实现了,

而是直接在前后相继中调用 ntdll.dll 中的 Native API NtCreateProcess 来成功,

而那类程序即称为 Native Application !

           

Native Application 的运作条件:

地点也说了,Native Application 是只好够访谈 ntdll.dll 中的内容的,

而风姿浪漫旦是在子系统下运营二个前后相继的话,必然会加载其余的 DLL,

举个例子说在 Windows 子系统下一个 kernel32.dll 是供给的啊,

万风华正茂 Native Application 能够运维在 Windows 子系统下的话,必然也会加载到 Kernel32.dll,

这么不就和地点相背离了嘛 ~

综上可得:Native Application 是不可以预知运行在任何子系统下的 !

澳门网址赌场正规网址 ,举例在 Windows 子系统下运作 Native Application 会弹出如下错误对话框:

澳门网址赌场正规网址 10

          

Native Application 的开行机遇:

对于 Windows 操作系统的教导进程,这里需求带一笔的,Windows 操作系统运维时,

当 Windows 内核的携带产生之后,就能够运营会话管理器 smss.exe 进程了,

smss.exe 进度固然是一个客商方式的长河,然则那几个进度相对于其余顾客情势进度是装有一定特殊性的,

率先 smss.exe 进度是平昔建立在 Windows NT 内核上的,其不依据于别的二个景况子系统,

有关不依据于其余三个境况子系统这一说的话,依然得以很好的解说的,

因为当景况子系统经过(Windows 子系统经过为 csrss.exe卡塔尔就是由 smss.exe 进程运营的,

接下来 smss.exe 是 Windows 操作系统运营的第多个客户态进度,

而 Native Application 也归于客户态程序,自然 Native Application 的开行是在 smss.exe 之后,

从此前面也说过,Native Application 运维时,子系统经过尚未运营,

为此 Native Application 的启航则是在 csrss.exe 以前的,

而话又说回去,csrss.exe 就是由会话微型机(smss.exe卡塔尔运营的,

进而Native Application 的启动机遇也就独有生机勃勃种恐怕了,

即 smss.exe 先运行 Native Application,然后 Native Application 带头施行,

等到 Native Application 都给实践完了后 smss.exe 再开发银行 csrss.exe 进度。

(事实上,Win32 应用程序情形子系统 csrss.exe 本质上也是三个 Native Application ~)

上面给出意气风发副截图以验证 SMSS.EXE 的在开发银行进程中所达成的做事:

运转运维时实施的前后相继便是施行Native Application

澳门网址赌场正规网址 11

          

           

4. Native Application 有什么妙用:

              

前边也涉嫌过,Native Application 的施用范围相比窄,那至关心重视要受以下几点限制:

首先,Native Application 是一直调用 Native API 来落成职务的,

而在 Windows 中,Native API 绝半数以上都是 Undocument 的,那样开荒起来自然难度会大比超级多了。

然后,由于 Native Application 是调用的 Undocument API,

说不定那一天 Microsoft 就在新一代 Windows 中期维改良了那几个API,那样的话,你程序的可移植性也就全盘没了。

末段的话,Native Application 的实行景况并不是是在 Windows 子系统中,

事实上,当 Native Application 初阶实施的时候,Windows 子系统经过(csrss.exe卡塔尔国进度都尚未曾运营的 ~

之所以 Native Application 的推行是受约束的,其不可见试行子系统中的任何事物,

说白一点的话正是Native Application 只好调用 ntdll.dll 中的 API,

任何 DLL 中的 API 后生可畏律不得调用,那样也就注定 Native Application 的行使范围不会很广阔了。

          

利用范围相比窄并不等于说并未有采纳价值,

也仍有蛮多的软件,包含一些商业软件也皆以用了 Native Application,

上边来看一些 Native Application 的施用(小编也只是从网络自己还一头雾水惹人昭昭,不过某些也确确实实是本身也用过的卡塔尔:

最标准的利用自然是归属Windows 操作系统自带的磁盘自检程序了;

下一场比较独立的经济贸易使用是瑞星的开机杀毒,即落到实处让病毒在您还未完全开机此前死掉;

下一场正是可以通过 Native Application 来兑现接管 Windows 的开机运维分界面和密码输入界;

还足以经过 Native Application 来实现开机前的磁盘修复(Windows 自带了那款工具也是那般达成的卡塔尔(قطر‎;

      

           

5. MJ0011 关于 Native Application 的稿子收拾:

          

这一小节里面根本是收拾一下关于 MJ0011 的 Native Application 的博文,

也正是说我这里纯粹是将她的东西给贴出来瞧瞧,关于 MJ0011 博文的原地点为:

《NATIVE应用程序详细之生机勃勃》:

http://hi.baidu.com/mj0011/blog/item/7ee496d67a4d4d2f07088bc7.html

《NATIVE应用程序详细之2 NATIVE应用程序的优势和瑕玷》

http://hi.baidu.com/mj0011/blog/item/f8108f2f5890fb381e30896d.html

《native应用程序详细之三 构建native应用程序》:

http://hi.baidu.com/mj0011/blog/item/725b4882042b03a20df4d269.html

《深刻Native应用程序》(该文翻译自《Inside Native Application》卡塔尔国:

http://hi.baidu.com/mj0011/blog/item/85c0b50f80b1baedab6457de.html

《native app GUI分界面的得以实现》:

http://hi.baidu.com/mj0011/blog/item/6e5a22fa214c8116a9d3115b.html

                   

Native 应用程序简要介绍:

NT 系统被规划改为支持子系统(封装),它能够推行在不相同平台上的代码。包涵但不限于:POSIX、OS/2和Win32,

为了管住这一个子系统,NT内核出口了汪洋名称叫Native API的API函数,子系统服务将这么些函数包装为她们慈爱的函数。

比方说:CreateFile和fopen都被映射到NtCreateFile.那么子系统管理程序运营在哪个子系统中?

为了防止先有鸡依旧先有蛋的标题,NT系统相符支撑原生的Native应用程序。

那么些Native应用程序是单独于子系统的。以后,全体的子系统应用程序都急需登记它们本人的子系统服务,

大名鼎鼎,Kernel32是三个Win32应用程序,csrss注册WIN32子系统,然后公告子系统微处理器SMSS,

由此,一个Native应用程序是不也许调用个中数千种API的,

并且它也回天乏术采纳一些主干的DLL中的函数比方kernel32、user32、gdi32等,

其余任何调用了那三者的DLL中的函数的DLL也不可能被选取。

实际上,加载者在其入口点未有被加载前,并不许加载决大超级多的Win32 DLL。

为此,native应用程序被约束只许使用叁个DLL:ntdll.dll,这么些DLL供应全数Native和周转函数。

不过思谋,既然全数Win32函数最终都以去调用Ntdll.dll中的函数来达成的(除了GUI部分),

这个函数就早就丰盛了,不是吗?

           

Native应用程序优势:

(生机勃勃State of Qatar内部存款和储蓄器使用和大小:因为Native应用程序并没有必要加载90三个DLL到内部存款和储蓄器中去,因而其采纳的内部存款和储蓄器是比十分小的。

(二) 速度:Native API比Win32对应的函数要越来越快(平日会快超多),

即使实际上超级多时刻都被消耗在Win32 API的卷入上,那几个满含校勘、宽容性选项,和别的的代码部分,

那一个都会在实行真正的Native调用前实行。若是您通晓哪些去做并且希望它运维得越来越快,Native是二个很好的秘诀。

因为没有必要加载那90五个DLL,kernel32不须要到csrss和smss做lpc注册,因而运营也是可怜火速和直接的。

(三卡塔尔国熟练程度和特色:Native应用程序并未好奇的入口点大概意想不到的Hack,就象读命令行同样轻松利用,

而事实准就要后面介绍,Native应用程序和Console程序同样运转与_main函数,

因此豆蔻梢头组大致的char*[]队列来选取命令行参数和情状变量,就象叁个标准的Win32 Console程序同样,

本文由澳门网络娱乐游戏平台发布于操作系统,转载请注明出处:澳门网址赌场正规网址Python 写Windows Service服务程序,pythonservice

相关阅读