【问题标题】:Auto Start Application on Startup - Wait for API to be available启动时自动启动应用程序 - 等待 API 可用
【发布时间】:2013-11-11 11:16:08
【问题描述】:

替代标题:打开控制时自动运行 THINC 应用程序(仅在 OSP NC 系统启动后运行)

我正在为 OSP-P300 控件(运行 WinXP)编写应用程序,并希望它在控件启动/打开时自动启动。我尝试在启动文件夹中使用快捷方式,但这会导致问题。

当应用程序在 NC 软件完成启动之前运行时,我的 THINC API 函数出现错误。 (API 尚不可用)

我知道“Okuma THINC 启动服务”程序,并让它在我的控制下运行。手动配置时,此方法会解决问题并在适当的时间加载我的应用程序。

我的问题是:有没有办法在安装过程中以编程方式将我的应用程序添加到启动服务?

是的,用户仍然可以手动执行此操作,但安装期间默认选中的复选框选项会简单得多。

是否可以像添加几个注册表项一样简单?

【问题讨论】:

    标签: registry windows-installer startup okuma


    【解决方案1】:

    使用 API 磁盘上的启动服务。
    这是我用来注册/注销的类。
    我从这里得到的 CReg 类:RegistryKeyAccess.vb

    导入 Microsoft.Win32

    Public Class ThincStartupReg
    
        Public Overloads Shared Sub Register(ApplicationPath As String, ApplicationName As String, AppType As enumAppType, wait As Boolean, LaunchType As enumLaunch)
            Try
                Dim ObjReg As New CReg
                Dim regCreated As Boolean
    
                If ObjReg.ReadValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\StartupService\", "State") Then
    
                    'Startup Service is installed
    
                    If Not ObjReg.ReadValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName, "Enabled") Then
                        'No entry for this program
                        regCreated = ObjReg.CreateSubKey(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName)
    
                    Else
                        regCreated = True
                    End If
    
                    If regCreated Then
                        ObjReg.WriteValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName,
                                         "Type", "Process")
                        ObjReg.WriteValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName,
                                          "Name", ApplicationName)
                        ObjReg.WriteValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName,
                                          "Enabled", "True")
                        ObjReg.WriteValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName,
                                          "Wait", If(wait, "True", "False"))
                        ObjReg.WriteValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName,
                                          "Type", If(AppType = enumAppType.Process, "Process", "Service"))
                        ObjReg.WriteValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName,
                                          "Launch", If(LaunchType = enumLaunch.LaunchOnce, "Once", "Monitor"))
                        ObjReg.WriteValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & ApplicationName,
                                         "File", ApplicationPath)
                    End If
    
    
                End If
    
            Catch ex As Exception
                Throw ex
            End Try
    
        End Sub
    
        Public Overloads Shared Sub Register(ThisAssembly As System.Reflection.Assembly, ByVal AppType As enumAppType, ByVal Wait As Boolean, ByVal LaunchType As enumLaunch)
            Dim AppName = ThisAssembly.FullName.Split(",")(0)
            Dim AppPath = ThisAssembly.Location
            Register(AppPath, AppName, AppType, Wait, LaunchType)
        End Sub
    
        Public Shared Sub UnRegister()
            Try
                Dim ObjReg As New CReg
                Dim AppName = System.Reflection.Assembly.GetExecutingAssembly().FullName.Split(",")(0)
    
                If ObjReg.ReadValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\StartupService\", "State") Then
                    If ObjReg.ReadValue(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & AppName, "Enabled") Then
                        ObjReg.DeleteSubKey(ObjReg.HKeyLocalMachine, "SOFTWARE\OAC\Startup\" & AppName)
                    End If
    
                End If
    
            Catch ex As Exception
                Throw ex
            End Try
    
        End Sub
    
    
    End Class
    

    如果您不确定安装服务是否会安装,您可以将快捷方式添加到启动文件夹,然后循环直到 OSP 进程开始。

    Public Shared Function Wait(Timeout As TimeSpan) As Integer
            If File.Exists("C:\OSP-P\OSPMNGCD.CNC") Then
                Dim startTime = Now
                Dim myProcess As Process() = Process.GetProcessesByName("PNC-P200")
                While myProcess.Length = 0
                    If Now.Subtract(startTime) >= Timeout Then Return -1
                    myProcess = Process.GetProcessesByName("PNC-P200")
                    Thread.Sleep(1000)
                End While
                'OSP Started
                Return 1
            End If
            'Simulation mode (not on a machine)
            Return 2
        End Function
    

    【讨论】:

      【解决方案2】:

      实用添加启动项以供 THINC 启动服务 (TSS) 处理的说明:

      通过 TSS 启动应用程序由注册表控制,在以下键中:

      “HKEY_LOCAL_MACHINE\Software\OAC\Startup”

      要“注册”您的应用程序以由 TSS 处理,请在 Startup 下创建一个子键, 为您的应用命名:

      “HKEY_LOCAL_MACHINE\Software\OAC\Startup\ScottsApp”

      ScottsApp 然后应该被分配以下值:

          NAME
          FILE
          TYPE
          ENABLED
          LAUNCH
          WAIT
          DELAY
          ARGUMENT
      

      NAME = 如果是进程,则为应用程序的“显示名称”,如果是 Windows 服务,则为服务名称

      FILE = 应用程序可执行程序集的完整路径,包括可执行文件名称。如果 TYPE 值为“SERVICE”,则会在内部忽略这一点,因为 TSS 将使用 NAME 值来启动指定的 Windows 服务

      TYPE = “服务”或“过程”

      已启用 = TRUE 或 FALSE(布尔值)。允许在不完全从 TSS 列表中删除的情况下启用或禁用启动项

      LAUNCH = "ONCE" 或 "MONITOR" 如果为“ONCE”,则应用程序启动一次;如果为“MONITOR”,则应用程序保持活动状态 - 如果用户关闭它,TSS 将重新启动它

      WAIT = TRUE 或 FALSE(布尔值)如果为 FALSE,则应用程序将在 TSS 在启动时启动时立即启动。如果为 TRUE,则只有在 TSS 检测到 Okuma NC 控制软件已完全启动且 THINC API 可用后,才会启动应用程序。

      延迟 = 整数值;表示在满足 WAIT 条件后,在启动应用程序之前 TSS 应等待的毫秒数。例如,如果您想再等待 10 秒,请将此值设置为 10000

      ARGUMENT = 应用程序所需的任何命令行参数

      【讨论】:

        猜你喜欢
        • 2014-05-06
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-11
        • 2012-10-14
        • 1970-01-01
        • 2011-04-06
        相关资源
        最近更新 更多