code: func installService() error {
  	// Get the path of the current executable.  This is needed because
  	// os.Args[0] can vary depending on how the application was launched.
  	// For example, under cmd.exe it will only be the name of the app
  	// without the path or extension, but under mingw it will be the full
  	// path including the extension.
  	exePath, err := filepath.Abs(os.Args[0])
  	if err != nil {
  		return err
  	}
  	if filepath.Ext(exePath) == "" {
  		exePath += ".exe"
  	}
  
  	// Connect to the windows service manager.
  	serviceManager, err := mgr.Connect()
  	if err != nil {
  		return err
  	}
  	defer serviceManager.Disconnect()
  
  	// Ensure the service doesn't already exist.
  	service, err := serviceManager.OpenService(svcName)
  	if err == nil {
  		service.Close()
  		return fmt.Errorf("service %s already exists", svcName)
  	}
  
  	// Install the service.
  	service, err = serviceManager.CreateService(svcName, exePath, mgr.Config{
  		DisplayName: svcDisplayName,
  		Description: svcDesc,
  	})
  	if err != nil {
  		return err
  	}
  	defer service.Close()
  
  	// Support events to the event log using the standard "standard" Windows
  	// EventCreate.exe message file.  This allows easy logging of custom
  	// messges instead of needing to create our own message catalog.
  	eventlog.Remove(svcName)
  	eventsSupported := uint32(eventlog.Error | eventlog.Warning | eventlog.Info)
  	return eventlog.InstallAsEventCreate(svcName, eventsSupported)
  }
docs: // installService attempts to install the btcd service.  Typically this should
  // be done by the msi installer, but it is provided here since it can be useful
  // for development.