大家好
我把一个exe文件用sc.exe注册成了系统服务,exe文件是正常可以运行的!但是我在MMC当中启动服务就提示错误1053,所以每次exe运行过后就被windows系统强制结束了,请问各位该怎样让exe文件返回一个“我”启动成功的消息给windows呢?让它启动成功?我想这不难啊,但是我是个菜鸟,谢谢大家了!最好用C语言写奥!实现了马上就结贴。
谢谢!
我把一个exe文件用sc.exe注册成了系统服务,exe文件是正常可以运行的!但是我在MMC当中启动服务就提示错误1053,所以每次exe运行过后就被windows系统强制结束了,请问各位该怎样让exe文件返回一个“我”启动成功的消息给windows呢?让它启动成功?我想这不难啊,但是我是个菜鸟,谢谢大家了!最好用C语言写奥!实现了马上就结贴。
谢谢!
让程序作为服务运行
想让一个程序在启动系统的时候自动运行,你有什么好办法?添加到启动组?那如果别人删除掉就不管用了。如果你使用了Windows NT/2000/XP,就可以试试把这个程序添加为一个服务,这样只有拥有权限的人才可以更改服务,只要你设置好权限,就不用担心会被别人删除了。
要把应用程序添加为服务,你需要两个小软件:Instsrv.exe和Srvany.exe。Instsrv.exe可以给系统安装和删除服务,Srvany.exe可以让程序以服务的方式运行。这两个软件都包含在Windows NT Resource Kit里,如果你没有,也可以点击这里下载。
把这两个程序保存在一个方便的位置,例如C盘根目录下。我们举例来说明,把OE作为一个服务添加进Windows XP Professional操作系统中,并把这个服务命名为“Mail”。在运行中输入“CMD”,回车,打开命令行窗口,在提示符后面直接输入:“c:\instsrv.exe Mail c:\srvany.exe”然后回车,其中的“c:\instsrv.exe”和“c:\srvany.exe”表示这两个程序保存的位置,而Mail则是你想添加的服务名称。
运行Regedit打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,找到刚才添加的Mail,点击右键,新建一个键,命名为“Parameters”,点击新建的Parameters,并再次新建一个名称为“Application”的子键,数据类型为“REG_SZ”,数值为希望作为服务运行的程序的所在位置,如果你的Windows系统安装在C盘下,那么OE的程序位置就是C:\Program Files\Outlook Express\msimn.exe ,把这个路径添入数值中。到现在,这个服务已经成功的添加并且设置好了。如果你希望做的更加专业,可以在Mail服务下建立一个名为Description的子键,数据类型同样为REG_SZ,数值可以写一些你对这个服务的描述,这个我们在后面可以看到。
接下来需要对服务做一些额外的设置,在运行中输入“Services.msc”并回车,在列表中找到我们刚添加的Mail服务,双击打开,来做详细的设置。在“General”选项卡上,我们需要设置这个服务的运行方式,在图二中可以看见,作为一个服务,有“自动(Automatic)”,“手动(Manual)”和“禁止(Disabled)”三种启动类型,按照需要,我们一般设置成自动就可以了。而在“Logon”选项卡下可以设置以什么身份运行这个服务,一般可以不用理会,按照默认的设置。“Recovery”选项卡下则是进行恢复设置的,你可以指定,在服务第一次,第二次和第三次出错之后分别采取什么措施。“Dependencies”则显示了服务之间的依存关系,可以让你察看这个服务的运行依赖哪些其它服务,以及还有什么服务依赖于这个服务。这后面几个对我们一般用户没有什么意义。经过这些设置,你的服务已经完全可以正常工作了。
注销一下看看。为了让你看清除,我们先打开OE,这时在任务管理器里,有两个msimn进程,用户名为“.com.cn”的是我们打开的OE,而用户名为“SYSTEM”的就是我们添加的服务。还有一个方法就用windows自带的sc命令
LPTSTR ServiceName = _T("TestService");
SERVICE_STATUS_HANDLE StatusHandle;
SERVICE_STATUS ServiceStatus;DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
switch (dwControl)
{
case SERVICE_CONTROL_STOP:
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
}
ServiceStatus.dwCheckPoint++;
SetServiceStatus(StatusHandle, &ServiceStatus);
return NO_ERROR;
}void Run()
{
}void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)
{
StatusHandle = RegisterServiceCtrlHandlerEx(ServiceName, HandlerEx, NULL);
if (StatusHandle != NULL)
{
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
ServiceStatus.dwWin32ExitCode = NO_ERROR;
ServiceStatus.dwServiceSpecificExitCode = NO_ERROR;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
SetServiceStatus(StatusHandle, &ServiceStatus);
Run();
}
}SERVICE_TABLE_ENTRY ServiceTableEntry[] = {
{ServiceName, ServiceMain},
{NULL, NULL}
};int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
StartServiceCtrlDispatcher(ServiceTableEntry);
return -1;
}