写了一个windows service来启动我的程序A,并且能监控之,现在服务能够正常注册\删除\启动什么的,但是在操作系统重启后,用户尚未登陆时,该服务已在后台启动了程序A,而A需要根据设置好的系统DSN来访问Oracle数据库(另外一台机器),当我以管理员身份登陆进入操作系统后发现程序A访问数据库失败。即程序A在初始化过程中需要访问一些数据信息,但由于用户未登陆,所以访问数据库失败。我不知道数据库失败的具体原因,表面上看就是未登陆而引起的,因为登陆后,将A关闭,随即这个windows service侦测到A进程不存在了,便create了一个新的,而这个就能访问数据库。不知道是不是跟服务的启动的顺序有关,比如网络还未初始化好(我用的ADO连接数据库,还特意将连接超时设置得比较长,默认是15秒,我设为了100秒,但无效),又或者是系统DSN还没有初始化好…… 所以想请教一下,编写这种windows service的时候有没有什么手段来解决此类问题。而且我发现有关windows service编程的信息比较少,codeproject上也就那么几个,高手们能否提供几个链接?

解决方案 »

  1.   

    如果是因为顺序原因,在CreateService中有设定依赖关系啊
    SC_HANDLE CreateService(
      SC_HANDLE hSCManager,
      LPCTSTR lpServiceName,
      LPCTSTR lpDisplayName,
      DWORD dwDesiredAccess,
      DWORD dwServiceType,
      DWORD dwStartType,
      DWORD dwErrorControl,
      LPCTSTR lpBinaryPathName,
      LPCTSTR lpLoadOrderGroup,
      LPDWORD lpdwTagId,
      LPCTSTR lpDependencies,
      LPCTSTR lpServiceStartName,
      LPCTSTR lpPassword
    );
    lpDependencies 
    [in] Pointer to a double null-terminated array of null-separated names of services or load ordering groups that the system must start before this service. Specify NULL or an empty string if the service has no dependencies. Dependency on a group means that this service can run if at least one member of the group is running after an attempt to start all members of the group. 
    You must prefix group names with SC_GROUP_IDENTIFIER so that they can be distinguished from a service name, because services and service groups share the same name space.,服务控制器会事先启动你依赖的服务,再启动你的服务
      

  2.   

    很久没来了,这个问题一直搁置,困难在于通过Oracle客户端(配置系统DSN)访问Oracle数据库需要依赖windows什么服务呢?