我在阅读包:SvcMgr源代码时发现其中对于类TService有两个定义:
TService = class;
TService = class(TDataModule)
请问这是否符合Object Pascal的语法定义?
现正在研究Delphi中服务程序的实现、和启动流程,编写了一个服务程序,在操作系统启动的时候无法启动,但登录之后,没有做任何操作,进入服务管理却可以手工启动,请教原因?

解决方案 »

  1.   

    你的服务程序StartType是否stAuto?
      

  2.   

    TService = class;告诉编绎器,后面将建立一个TSERVICE类,这个类可能在定义之前先被引用
    TService = class(TDataModule)真正的定义这个类,VCL的语法当然符合OBJECT PASCAL的定义,里面还有没多看起来怪怪的东东,但却是OBJECT PASCAL的精髓
      

  3.   

    TService = class;
    在C里这叫前置声明,不过一般不在这个地方用,这句应该可以不用:)
      

  4.   


    启动windows没有自动启动的原因如下(仅仅是我知道的)1.转hthunter(核桃)(我将要认识一个好mm) 
      你的服务程序StartType是否stAuto?
    2.你的程序需要其他进程的辅助比如你的程序使用了数据库,而数据库引擎还没有启动那么你的程序将会启动失败。
      
     
      

  5.   

    对于YANGYUGW(小杨)所说的第二点,我补充一下,因为我以前也遇到过。
    其实那就是服务管理器中某一个服务的“依存关系”的“该服务所依赖的服务”,一个服务假如有依赖的服务,要启动的话首先它所依赖的服务需要启动的。通过以下设置可以在所依赖服务没有启动时自动先将它启动:
        设置TService的Dependencies,添加,name设置为所依赖服务的名称。
    但是这样有时候也不能完全保证服务能正常启动,我当初做的一个依赖于SQL Server的服务在某些机器上就不能正常启动,我后来又作了以下设定:
        在服务管理器中打开我自己的服务,在“恢复”中把“第一次失败”、“第二次失败”、“后继失败”所作的操作都设置为“重新启动服务”。ok, then
      

  6.   

    月的说法不错。前置申明在很多语言里都会有的,VCL库里其实有很多这样的例子的
      

  7.   

    正确的。比如说 TClass1 要用到 TClass2,但 TClass2 定义在 TClass1 的后面,那么就可以但 TClass1 前面声明
    TClass2 = class;
    这样就可以正确调用了
      

  8.   

    使用前声明是好多种开发语言C/C++,PASCAL都有的语法..
    一来为人读源码方便.
    二来为编译器读源码方便.
      

  9.   

    看看Tparams的代码你就会知道了