阅读:1370回复:10
如何写一个服务器应用程序
如何写一个服务器应用程序?如:\"Norton AntiVirus 警报服务\"那样的,然后如何安装?
我写过很多sys,vxd等,是使用Service API吗?可安装怎么半,写个inf文件? 我发现所有“服务”的类型都是LegacyDriver的 请诸位指点 |
|
|
沙发#
发布于:2003-05-23 15:35
MSDN:Service Sample: Create and Install a Service
|
|
板凳#
发布于:2003-05-23 19:19
最简单的就是修改几个注册表项:
hklm\\system\\currentcontrolset\\services\\下面添加。 每个大概有几项必须写,具体你可以参考系统本身的。 displayname: hello imagepath: \\??\\e:\\hello.sys type:1 start:3 或者你写个inf. |
|
地板#
发布于:2003-05-26 10:11
最简单的就是修改几个注册表项: 这位兄台说的与我的问题不相关,我说的是象\"Norton AntiVirus 警报服务\"那样的服务程序,一个可执行程序,它更本不是在ring0运行的,而是在ring3,在你没有登录win2000时,它已经启动并运行,而sys是工作在ring0的驱动程序 不论怎样谢谢老兄关注 |
|
|
地下室#
发布于:2003-05-26 10:15
MSDN:Service Sample: Create and Install a Service 老大,这个Sample中的install可能应该理解位加载(装载之类),而不是安装,其代码如下: void CmdInstallService() { SC_HANDLE schService; SC_HANDLE schSCManager; TCHAR szPath[512]; if ( GetModuleFileName( NULL, szPath, 512 ) == 0 ) { _tprintf(TEXT(\"Unable to install %s - %s\\n\"), TEXT(SZSERVICEDISPLAYNAME), GetLastErrorText(szErr, 256)); return; } schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if ( schSCManager ) { schService = CreateService( schSCManager, // SCManager database TEXT(SZSERVICENAME), // name of service TEXT(SZSERVICEDISPLAYNAME), // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type SERVICE_DEMAND_START, // start type SERVICE_ERROR_NORMAL, // error control type szPath, // service\'s binary NULL, // no load ordering group NULL, // no tag identifier TEXT(SZDEPENDENCIES), // dependencies NULL, // LocalSystem account NULL); // no password if ( schService ) { _tprintf(TEXT(\"%s installed.\\n\"), TEXT(SZSERVICEDISPLAYNAME) ); CloseServiceHandle(schService); } else { _tprintf(TEXT(\"CreateService failed - %s\\n\"), GetLastErrorText(szErr, 256)); } CloseServiceHandle(schSCManager); } else _tprintf(TEXT(\"OpenSCManager failed - %s\\n\"), GetLastErrorText(szErr,256)); } 丛上面的代码来看,只是一次性的运行某服务,而不是在安装到系统中,而后每次都象\"Norton AntiVirus 警报服务\"那样的服务程序自动加载了 |
|
|
5楼#
发布于:2003-05-26 10:42
StartServiceCtrlDispatcher
RegisterServiceCtrlHandler SetServiceStatus ... |
|
6楼#
发布于:2003-05-26 10:56
[quote]MSDN:Service Sample: Create and Install a Service 老大,这个Sample中的install可能应该理解位加载(装载之类),而不是安装,其代码如下: void CmdInstallService() { SC_HANDLE schService; SC_HANDLE schSCManager; TCHAR szPath[512]; if ( GetModuleFileName( NULL, szPath, 512 ) == 0 ) { _tprintf(TEXT(\"Unable to install %s - %s\\n\"), TEXT(SZSERVICEDISPLAYNAME), GetLastErrorText(szErr, 256)); return; } schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if ( schSCManager ) { schService = CreateService( schSCManager, // SCManager database TEXT(SZSERVICENAME), // name of service TEXT(SZSERVICEDISPLAYNAME), // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type SERVICE_DEMAND_START, // start type SERVICE_ERROR_NORMAL, // error control type szPath, // service\'s binary NULL, // no load ordering group NULL, // no tag identifier TEXT(SZDEPENDENCIES), // dependencies NULL, // LocalSystem account NULL); // no password if ( schService ) { _tprintf(TEXT(\"%s installed.\\n\"), TEXT(SZSERVICEDISPLAYNAME) ); CloseServiceHandle(schService); } else { _tprintf(TEXT(\"CreateService failed - %s\\n\"), GetLastErrorText(szErr, 256)); } CloseServiceHandle(schSCManager); } else _tprintf(TEXT(\"OpenSCManager failed - %s\\n\"), GetLastErrorText(szErr,256)); } 丛上面的代码来看,只是一次性的运行某服务,而不是在安装到系统中,而后每次都象\"Norton AntiVirus 警报服务\"那样的服务程序自动加载了 [/quote] 仔细看看帮助吧,这不是“一次性”的运行,而是“永久性”的安装。 除非你以后调用DeleteService()把它删除,否则它会永远驻留在 注册表里边,每一次系统启动时它都会启动。 特别注明: 针对这段代码,我所说的“永久性”安装也不完全对。必须更改一个参数才能真正达到“永久性”安装。即“SERVICE_DEMAND_START -> SERVICE_BOOT_START(或者SERVICE_AUTO_START,具体问题具体分析)”。 |
|
7楼#
发布于:2003-05-26 14:19
多谢,的确是这样 |
|
|
8楼#
发布于:2003-05-26 14:20
多谢,的确是这样,我没有看看完,还有arthurtu兄多谢了 |
|
|
9楼#
发布于:2003-05-26 14:20
多谢,的确是这样,我没有看完,不好意思,还有arthurtu兄多谢了 |
|
|
10楼#
发布于:2003-05-26 15:18
如果要显示用户界面,该这样操作呢?
|
|
|