我把一个程序做成windows服务(用的是ocx控件方式),
Option ExplicitPrivate Sub Form_Load()
    Dim strFile     As String
    
    With NTService1
        If Command = "/i" Then
            .StartMode = 2
            .DisplayName = "ddd"
            .ServiceName = "ddd"
            .Interactive = True
            If .Install Then
                'Save the TimerInterval Parameter in the Registry
                .SaveSetting "Parameters", "TimerInterval", "300"
            Else
            
            End If
            End
        'Remove the Service Registry Keys and uninstall the service
        ElseIf Command = "/u" Then
            If .Uninstall Then
            
            Else
            
            End If
            End
        'Invalid parameter
        ElseIf Command <> "" Then
            End
        End If
        .ControlsAccepted = 2 'svcCtrlPauseContinue
        .StartService
    End With
    
    strFile = App.Path & IIf(Right(App.Path, 1) = "\", "", "\") & "ddd.exe"
    If Dir(strFile) <> "" Then
        Call Shell(strFile)
    End If
    
    If App.PrevInstance Then
        End
    End If
    
    Me.Hide
End SubPrivate Sub Form_Paint()
    Me.Hide
End SubPrivate Sub Form_Resize()
    Me.Hide
End SubPrivate Sub Form_Unload(Cancel As Integer)
    With NTService1
        .StopService
    End With
End SubPrivate Sub NTService1_Continue(Success As Boolean)
    Success = True
End Sub
Private Sub NTService1_Pause(Success As Boolean)
    Success = True
End SubPrivate Sub NTService1_Start(Success As Boolean)
    Success = True
End SubPrivate Sub NTService1_Stop()
    On Error Resume Next
    Unload Me
End Sub
在我的ddd.exe中,有用到api函数现在的问题是:我指定本地系统账户运行ddd.exe的时候,有些api函数无法执行,我怀疑是权限设置的问题。可是如果指定administrator来运行服务,问题又来了,我如何设置服务允许桌面交互呢?不设置为允许交互是不能运行外部程序的 。
有高手做过这个吗?帮帮忙

解决方案 »

  1.   

    如果没有这些API函数(读硬盘编号,网卡地址等),程序运行一点问题都没有
      

  2.   

    一般不要让服务和桌面交互。完全可以使用注册表和消息通讯。比如SQL Server的服务、SQL Server服务管理器、SQL Server企业管理器就是分开的3个程序。
      

  3.   

    问题是我要启动我的ddd.exe,如果有办法能正常启动ddd.exe,一切问题都解决掉了
      

  4.   

    我目的只是用服务程序来启动我的另外一个程序ddd.exe,如果大家有在登录之前就启动程序的办法,那也行的,我做成服务也主要就是解决程序开机启动的问题。放在注册表的run主键下显然是不行的,那是需要登录以后才能运行,runservices下也不行的(xp和2003都不支持)
    做vxd咱不会,
      

  5.   

    那要看你的ddd.exe是个什么程序了,如果是桌面程序,或者需要调用特定api的,那么自然不行。不然也不要什么Windows服务程序了。
      

  6.   

    我ddd.exe就是桌面程序,不过如果有特定的api,如果不加这些api函数,用服务调用ddd.exe没什么问题的
      

  7.   

    可能你还是不要使用OCX的方式,还是做成模块的形式也许更合适
      

  8.   

    NT服务和应用程序是不同的,通常NT服务主要是提供一些没有图形界面的消息服务。
    和应用程序交互的通道以消息和网络信息为主。
    最好不要把NT服务当应用程序来做,因为两者存在的目的不同,一个是为服务,一个
    是为交互。对于应用程序,如果想隐藏界面,完全可以将界面隐藏起来工作,区别就
    是一个是在为登陆系统时启动,用的是System权限,一个是登陆后启动,用的是登陆
    用户的权限。如果不是以服务为目的,最好不要使用NT服务。
      

  9.   

    双击你的service,然后看到log on的tab,下面有一个checkbox allow service to interact with desktop
      

  10.   

    我也做过直接安装后就把那个checkbox选中的,找不到代码了。但是不记得为什么最终还是选择不要和桌面交互了
      

  11.   

    还有个问题就是,我直接把ddd.exe做成服务,我的ddd.exe是通过sub main启动的,直接做成ddd.exe以后启动服务会启动不起来的。说是没响应
      

  12.   

    我有VB NT Service的dll,无界面,如果需要,请发邮件 [email protected]
      

  13.   

    若要在系统未登陆前想运行程序,我所知道的只有三种方式:
    1、驱动程序
    2、一次性运行的应用程序
    3、服务程序如果你的程序不需要长期后台运作,只是单纯想在登陆前运行,
    也可以使用一次性运行的应用程序方法。
    你可以向注册表的:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
    添加你要运行的程序路径,他会帮你在启动的时候执行,不过执行完会自动删除里面所有
    的内容还有就是服务程序,如果需要交互,可能在创建服务的时候设置为交互模式,至于创建NT服务,
    可以通过 WMI 的方法创建,也可以通过相关的API函数创建服务,相对来说 WMI 因为是对象,
    所以使用应该算比较简单的。但API其实也不复杂,只要了解如下API函数就可以了
    OpenSCManager
    CreateService
    CloseServiceHandle
    CloseServiceHandle