开机自动运行程序代码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开机自动运行程序代码?相关的知识,希望对你有一定的参考价值。

参考技术A '先加载修改注册表的API函数:
Public
Declare
Function
RegSetValue
Lib
"advapi32.dll"
Alias
"RegSetValueA"
(ByVal
hKey
As
Long,
ByVal
lpSubKey
As
String,
ByVal
dwType
As
Long,
ByVal
lpData
As
String,
ByVal
cbData
As
Long)
As
Long
Public
Declare
Function
RegCreateKey
Lib
"advapi32.dll"
Alias
"RegCreateKeyA"
(ByVal
hKey
As
Long,
ByVal
lpSubKey
As
String,
phkResult
As
Long)
As
Long
Public
Declare
Function
RegCloseKey
Lib
"advapi32.dll"
(ByVal
hKey
As
Long)
As
Long
Public
Declare
Function
RegSetValueEx
Lib
"advapi32.dll"
Alias
"RegSetValueExA"
(ByVal
hKey
As
Long,
ByVal
lpValueName
As
String,
ByVal
Reserved
As
Long,
ByVal
dwType
As
Long,
lpData
As
Any,
ByVal
cbData
As
Long)
As
Long
Public
Declare
Function
RegDeleteValue
Lib
"advapi32.dll"
Alias
"RegDeleteValueA"
(ByVal
hKey
As
Long,
ByVal
lpValueName
As
String)
As
Long
'程序函数:
Public
Sub
SetAutoRun(ByVal
Autorun
As
Boolean)
Dim
KeyId
As
Long
Dim
MyexePath
As
String
Dim
regkey
As
String
MyexePath
=
App.Path
&
"\"
&
"(这里填写自己程序的名字)"
&
".exe"
'获取程序位置
regkey
=
"Software\Microsoft\Windows\CurrentVersion\Run"
'键值位置变量
Call
RegCreateKey(HKEY_LOCAL_MACHINE,
regkey,
KeyId)
'建立
If
Autorun
Then
RegSetValueEx
KeyId,
"MySoftware",
0&,
REG_SZ,
ByVal
MyexePath,
LenB(MyexePath)
Else
RegDeleteValue
KeyId,
"MySoftware"
End
If
RegCloseKey
KeyId
End
Sub
在主程序里调用就写:SetAutoRun
(True)就可以了
参考技术B 开机运行程序可不用另写代码啊,你把以把你的程序的执行文件放在系统启动项里,开机就可以自动运行了

嵌入式Linux设置开机自动运行程序(基于BusyBox init)

文章目录

目的

开机自动运行程序,或者说系统启动时自动运行程序,这是经常会需要用到的功能。这个功能通常依托于 init 程序实现。 init 是Linux在内核启动完成之后第一个启动的程序,该程序会运行一些特定位置的脚本,相当于实现开机运行程序的效果。

在常见的Linux发行版中 init 程序主要为 SysVinitSystemd 。在嵌入式Linux中根文件系统通常使用 buildroot 来建立, buildroot 默认是基于 BusyBox 构建根文件系统的,这种方式下默认的 init 程序可以称其为 BusyBox init 。 这篇文章将介绍通过 BusyBox init 实现开机自动运行程序的功能。

BusyBox init启动流程

inittab

BusyBox init 会在启动后读取 /etc/ 目录下的 inittab 文件,下面是其内容样式:

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts /dev/shm
::sysinit:/bin/mount -a
::sysinit:/bin/mkdir -p /run/lock/subsys
::sysinit:/sbin/swapon -a
null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd
null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin
null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout
null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr
::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS

# Put a getty on the serial port
console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL

# Stuff to do for the 3-finger salute
#::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r

可以从注释中看到这个文件记录的是一条条按照一定规则编写的语句。

BusyBox init 会在启动后执行第三个字段为 sysinit 的语句中的命令,会在关机时执行第三个字段为 shutdown 的语句中的命令。

在这里添加语句就可以实现开机运行程序了,不过一般不推荐这么做。

rcS 和 rcK

从上面文件中可以看到 sysinit 系列的语句最后一条会去执行 /etc/init.d/ 目录下的 rcS 脚本,也即开机时其它工作完成后会执行 rcS 这个脚本。同样的会在关机时先执行 /etc/init.d/ 目录下的 rcK 脚本。这两个脚本内容如下:

rcS

#!/bin/sh


# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set start
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i start
            ;;
    esac
done

rcK

#!/bin/sh


# Stop all init scripts in /etc/init.d
# executing them in reversed numerical order.
#
for i in $(ls -r /etc/init.d/S??*) ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set stop
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i stop
            ;;
    esac
done

可以看到 rcS 脚本会依据文件名排序依次读取 /etc/init.d/ 目录下名字为 S??* 格式的脚本文件,并执行其中的 start 方法。同用的 rcK 脚本会依据文件名逆排序读取 /etc/init.d/ 目录下名字为 S??* 格式的脚本文件,并执行其中的 stop 方法。

设置开机自动运行程序

对于我们需要设置开机运行程序而言,可以编写名字为 S??* 格式的脚本文件存放到 /etc/init.d/ 目录下,这样它就会在开机时被调用执行其中的 start 方法了。

名字为 S??* 格式的脚本文件默认在 /etc/init.d/ 目录下已经有一些了:

我们可以参考它们来编写自己的脚本开机脚本,这里创建名为 S77test 的文件,其中内容如下:

#!/bin/sh

umask 077

start() 
        echo "Starting test log: Naisu is coming!!!"


stop() 
        echo "Stopping test log: Naisu is leaving!!!"


restart() 
        stop
        start


case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        restart
        ;;
  *)
        echo "Usage: $0 start|stop|restart"
        exit 1
esac

exit $?

备注1:各个函数中不建议出现长时间阻塞的操作,如果有需求建议在命令后面加上 (空格)& 放到后台运行;
备注2:行尾必须是以只有换行符形式,不能是windows上回车加换行的形式;

调整脚本权限:

chmod 755 /etc/init.d/S77test

下面就是脚本在开关机时运行的演示了:

总结

在使用 BusyBox init 的嵌入式Linux系统中设置开机自动运行程序并不复杂,只要了解其脚本调用流程基本就可以了。

以上是关于开机自动运行程序代码?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式Linux设置开机自动运行程序(基于BusyBox init)

如何让一个脚本在开机后自动运行

Linux笔记:开机自动运行程序

开机自动运行程序Android

ubuntu linux,怎样查看哪些程序是开机自动运行的程序?

设置树莓派开机自动运行代码