发新话题
打印

[讨论]有窗口的程序是不是不能注册为服务?

[讨论]有窗口的程序是不是不能注册为服务?

软件作者:我通过修改注册表的方式将一个程序注册为服务,发现启动后程序运行了,但是过了一会儿又自动退出了。我是用c++ builder写的。发觉他是运行倒formoncreate就结束自动退出了,原因不详。还望请教。。

TOP

杀毒软件有窗口且是服务,怎么会有窗口就不能注册为服务了?
C++不是很了解,Delphi下可以这样注册为服务
复制内容到剪贴板
代码:
function InstallService(ServiceName, DisplayName, FileName: string): boolean;
var
  SCManager,Service: THandle;
  Args: pchar;
begin
  Result := False;
  SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if SCManager = 0 then Exit;
  try
   Service := CreateService(SCManager,  //句柄
                    PChar(ServiceName), //服务名称
                    PChar(DisplayName), //显示服务名
                    SERVICE_ALL_ACCESS, //服务访问类型
                    SERVICE_WIN32_OWN_PROCESS, //服务类型  or SERVICE_INTERACTIVE_PROCESS
                    SERVICE_AUTO_START, //自动启动服务
                    SERVICE_ERROR_IGNORE, //忽略错误
                    PChar(FileName),  //启动的文件名
                    nil,  //name of load ordering group (载入组名) 'LocalSystem'
                              nil,  //标签标识符
                    nil,  //相关性数组名
                    nil,  //帐户(当前)
                             nil); //密码(当前)

   Args := nil;
   StartService(Service, 0, Args);
   CloseServiceHandle(Service);
  finally
   CloseServiceHandle(SCManager);
  end;
  Result := True;
end;

TOP

它能够运行到oncreate说明已经启动了。怎么又退出了呢。。不懂。。

那位给个c的代码?还有,楼上的,代码是放在oncreate还是其他地方?

TOP

这是个函数定义,随便放哪里
要用的时候调用下就可以,比如你要在按下一个按钮就安装一个服务的话,就在onclick事件里
InstallService(szServiceName, DisplayName, szFileName)

TOP

C#写windows服务的时候可以添加windows窗体,理论上应该没有问题。但是你想把现有的程序改成服务,得自己写代码了...

TOP

楼上说对了问题,我看到别人是这么说的

如果你的程序本身不是服务,把程序当成服务启动后,该程序还是工作不正常的。程序应该写成服务的结构形式。
NT下不是所有的程序都可以注册成服务的。
必须是服务程序才可以。
你可以用bcb的向导创建服务程序。

TOP

但问题是不能用向导。一用原来代码就乱了。。看看api可以不。。。

TOP

引用:
这里是引用第[1 楼]ruler2006-03-16 15:40发表的:
杀毒软件有窗口且是服务,怎么会有窗口就不能注册为服务了?
C++不是很了解,Delphi下可以这样注册为服务
[code]function InstallService(ServiceName, DisplayName, FileName: string): boolean;
var
  SCManager,Service: THandle;
.......
除了直接调用Win32API进行创建服务外,还可以通过一个inf文件将应用程序注册成服务:
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=retest,,My_AddService_Name
[My_AddService_Name]
DisplayName=RRRRRRRR
Description=FFFFFFFF
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%\test.exe
将以上内容保存为一个inf文件,并安装就能注册成服务,旧版本的灰鸽子就是这样把自己注册成服务的,另外还可以通过windows自带的SC.EXE 可执行文件,它是 Win32 Platform SDK 中附带的一个工具。Visaul Studio .NET 2003 IDE 环境中也有这个工具,具体存放位置在:C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin\winnt。使用这个工具可以安装和移除服务。

  但一个普通应用程序想从服务启动,必须遵循MS服务的规范,否则服务无法正常启动,具体可以参考老外的一篇文章:Five Steps to Writing Windows Services in C
地址为:http://www.devx.com/cplus/Article/9857/1954?pf=true

TOP

但一个普通应用程序想从服务启动,必须遵循MS服务的规范,否则服务无法正常启动

要自己用api了。。。

TOP

搞定


  HANDLE SvcMgr;
  HANDLE Svc;
  SvcMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  if(!SvcMgr)
    RaiseLastOSError();
  try
  {
     Svc=CreateService(SvcMgr,"1111","111",
        SERVICE_ALL_ACCESS,
        SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
        //SERVICE_AUTO_START
        SERVICE_AUTO_START, //自动启动服务
        SERVICE_ERROR_IGNORE, //忽略错误

        exefile.c_str(),NULL,NULL,NULL,NULL,NULL);
     if(!Svc)RaiseLastOSError();
     CloseServiceHandle(Svc);
  }
  __finally
  {
    CloseServiceHandle(SvcMgr);
  }


但是如果服务存在,程序就会出错。。。 [s:75]

TOP

搞定


  HANDLE SvcMgr;
  HANDLE Svc;
  SvcMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  if(!SvcMgr)
    RaiseLastOSError();
  try
  {
     Svc=CreateService(SvcMgr,"1111","111",
        SERVICE_ALL_ACCESS,
        SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
        //SERVICE_AUTO_START
        SERVICE_AUTO_START, //自动启动服务
        SERVICE_ERROR_IGNORE, //忽略错误

        exefile.c_str(),NULL,NULL,NULL,NULL,NULL);
     if(!Svc)RaiseLastOSError();
     CloseServiceHandle(Svc);
  }
  __finally
  {
    CloseServiceHandle(SvcMgr);
  }


但是如果服务存在,程序就会出错。。。 [s:75]

TOP

还有一个严重的问题。

我在csdn上提问如下:
我发现我得程序有时候因为响应一些东西,而改变为前台,我希望它一直在后台。因为到了前台,成为当前程序,虽然我设置为程序不可见,不在任务栏出现,但是仍然会影响当前用户操作,
如何确保程序始终在后台运行?


当时牛人回答,注册为服务。

但是现在成为服务了,好像还是会影响前台啊!!!
[s:52]  [s:52]  [s:52]  [s:52]  [s:52]  [s:52]

TOP

我觉得你说的程序的性质跟病毒有点像(当然不是说你在写病毒),为什么不参考一些病毒代码呢?很多病毒代码都是开放的。
还有最近又有什么“网络爸爸”,在进程表中也看不到,不知道在DOS下能不能看到。你也可以参考一下。
为国家富强奋斗,为人民疾苦呐喊!

TOP

不明白你的程序是做什么的  我说说我知道的情况

如果你的服务不需要和桌面交互  创建一个WinMain()或main()的工程即可
在主函数里StartServiceCtrlDispatcher()注册服务表  服务表里指定ServiceMain()
然后就是注册控制例程 创建/启动服务什么的!  不详细说了

如果需要和桌面交互  就必须在CreateService()中的dwServiceType指定
SERVICE_INTERACTIVE_PROCESS  这表示允许服务与桌面交互

至于用CreateService()创建服务 如果已存在GetLastError()会返回ERROR_SERVICE_EXISTS
这时有2种方法"编辑"服务  一是直接修改注册表  二是用ChangeServiceConfig()

但你不能先DeleteService()  然后CreateService()  这样CreateService()会报错  提示
服务名已经占用(我想这是SCM没有及时更新服务数据库的原因,适当的Sleep()也许可以解决,
但始终不稳定,指标不治本!)

网上讲服务的文章一大把  你应该仔细看看  有什么不明白的在来问!
请加47809945   100%通过!每个月总有那么几天,您的网络会受到黑客的攻击--坐立不安,烦躁无力,使用虎虎开发的"月月舒"防火墙,超轻超薄,易于携带,提供由内到外的全方位保护,即使流量再大,也可以冲浪自如,再也不用担心侧漏啦。

TOP

本来就是交互程序,需要交互,但是不希望影响前台程序,是不是有点矛盾??
有点向 qq。就是有消息但是不影响你的当前程序。而他是交互的。

TOP

qq是缩小到任务栏
不是服务
服务和跑在任务栏的程序有根本区别

最简单直观的区别
服务可以在计算机启动后由system去启动而不论你用户是否登陆。拥有system权限。
任务栏程序必须有用户登陆以后才能运行,只拥有运行这个程序的用户的权限

如果你一定需要和服务交互
1。输入使用配置文件。比如xml或者ini
2。输出使用log文件
这样服务程序从你配置文件获取输入并以log方式输出给你

记住。服务所创建的窗口是显示在system window内的
用户永远无法看到那个窗口
连入侵者都敢说自己在做网络安全。关键大家是真正为安全作过什么?

TOP

引用:
这里是引用第[15 楼]代码罐头2006-03-22 16:39发表的:
qq是缩小到任务栏
不是服务
服务和跑在任务栏的程序有根本区别

最简单直观的区别
.......
这个我知道,所以我问向qq这样使用TrayIcon,不知道是不是可以保证程序在后台运行,因为我只要保证后台就可以了.不一定要服务.服务对我来说只是增加了一个自启动方式而已..

TOP

好像托盘程序是后台运行的,呵呵.. [s:51]

TOP

呵呵~~~可以与用户直接交流的界面称为前台,它直接面向用户。那么后台么就是用户不需直接交流的啦,比如计算机在进入WINDOWS自动加载的项
关于前台程序/后台程序概念,其实前台程序/后台程序并不是一个很明确的概念。如果是一台机器上,通常把用户正在操作的程序称为前台程序,而用户没有操作但也在运行的程序(如系统服务)称为后台程序。
其实你可以下载这个看看,有很多的实例的
http://msdn.microsoft.com/platformsdk

TOP

后台的概念是模糊概念.
用户进程和系统进程就比较清晰了
如果你需要的只是一个不显示出来的用户进程.
那么托盘就可以达到
甚至你可以写一个按关闭按钮一个把界面disable掉的(vb说法)的程序
连入侵者都敢说自己在做网络安全。关键大家是真正为安全作过什么?

TOP

引用:
这里是引用第[18 楼]crey2006-03-22 22:03发表的:
关于前台程序/后台程序概念,其实前台程序/后台程序并不是一个很明确的概念。如果是一台机器上,通常把用户正在操作的程序称为前台程序,而用户没有操作但也在运行的程序(如系统服务)称为后台程序。
其实你可以下载这个看看,有很多的实例的
http://msdn.microsoft.com/platformsdk
我要的就是--用户没有操作但也在运行的程序,而且这个程序会受到一些信息.我就拿qq为例子.当有信息的时候,他只是给用户一个提示,但是并没有变成当前程序.而我现在的 程序,一旦有消息,他会成为当前程序.也就是影响用户了。.

TOP

发新话题