スタートアップにEXEを登録          <TOP>


Windows起動時に起動させるEXEをレジストリに登録します。

RegCreateKeyEx レジストリキーを作成

RegSetValueEx レジストリキーの値を設定

RegCloseKey レジストリのハンドルを解放

FormatMessage メッセージの文字列を指定の書式で取得

 

「開く」で、スタートアップに登録するEXEを選択し、「登録実行」でレジストリに書き込みます。

レジストリエディタで確認をしています。

 

'================================================================
'= スタートアップにEXEを登録
'=    (SetStartup.bas)
'================================================================
#include "Windows.bi"

Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

' レジストリキーを作成
Declare Function Api_RegCreateKeyEx& Lib "advapi32" Alias "RegCreateKeyExA" (ByVal hKey&, ByVal lpSubKey$, ByVal Reserved&, ByVal lpClass$, ByVal dwOptions&, ByVal samDesired&, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult&, lpdwDisposition&)

' レジストリキーの値を設定
Declare Function Api_RegSetValueEx& Lib "advapi32" Alias "RegSetValueExA" (ByVal hKey&, ByVal lpValueName$, ByVal Reserved&, ByVal dwType&, lpData As Any, ByVal cbData&)

' レジストリのハンドルを解放
Declare Function Api_RegCloseKey& Lib "advapi32" Alias "RegCloseKey" (ByVal hKey&)

' メッセージの文字列を指定の書式で取得
Declare Function Api_FormatMessage& Lib "Kernel32" Alias "FormatMessageA" (ByVal dwFlags&, lpSource As Any, ByVal dwMessageId&, ByVal dwLanguageId&, ByVal lpBuffer$, ByVal nSize&, Arguments&)

#define ERROR_SUCCESS &H0               '正常終了の戻り値を示す
#define HKEY_CURRENT_USER -2147483647   '現在Windowsにログインしているユーザーの情報
#define REG_OPTION_NON_VOLATILE 0       '設定内容をレジストリに保存
#define REG_BINARY 3                    'バイナリデータ
#define REG_DWORD 4                     '32ビットの数値
#define REG_DWORD_BIG_ENDIAN 5          'ビッグエンディアン形式の32ビット数値
#define REG_DWORD_LITTLE_ENDIAN 4       'リトルエンディアン形式の32ビット数値(REG_DWORDと同等)
#define REG_EXPAND_SZ 2                 '展開前の環境変数への参照が入ったヌル終端文字列
#define REG_LINK 6                      'Unicodeシンボリックリンク
#define REG_MULTI_SZ 7                  'ヌル終端文字列の配列
#define REG_QWORD 11                    '64ビット数値
#define REG_QWORD_LITTLE_ENDIAN 11      'リトルエンディアン形式の64ビット数値(REG_QWORDと同等)
#define REG_RESOURCE_LIST 8             'デバイスドライバのリソースリスト
#define REG_SZ 1                        'ヌル終端文字列
#define KEY_SET_VALUE &H2               'レジストリの値を設定する
#define FORMAT_MESSAGE_FROM_SYSTEM &H1000     'システムメッセージリソースを検索する

Var Shared Edit1 As Object
Var Shared Button1 As Object
Var Shared Button2 As Object

Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Button2.Attach GetDlgItem("Button2") : Button2.SetFontSize 14

Var Shared FileName As String

'================================================================
'= Startupに設定するファイル名
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    FileName = WinOpenDlg("ファイルのオープン", "*.exe", "アプリケーション(*.exe)", 0)
    If FileName <> Chr$(&H1B) Then
        Edit1.SetWindowText FileName
    End If
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var sa As SECURITY_ATTRIBUTES
    Var SubKey As String
    Var MSG As String
    Var sError As String
    Var Result As Long
    Var Disposition As Long
    Var Ret As Long

    SubKey = "Software\Microsoft\Windows\CurrentVersion\Run"

    'レジストリにキーを作成
    Ret = Api_RegCreateKeyEx(HKEY_CURRENT_USER, SubKey, 0, ByVal 0, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, sa, Result, Disposition)

    If Ret = ERROR_SUCCESS Then
        FileName = Edit1.GetWindowText
        If FileName = "" Then EXit Sub
        a = 0
        For b = 1 To Len(FileName)
            c = Asc(Mid$(FileName, b, 1))
            If c > &H39 Or c < &H30 Then a = 1 : Exit For
        Next

        If a = 1 Then
            Ret = Api_RegSetValueEx(Result, "Startup", 0, REG_SZ, FileName, Len(FileName) + 1)
        End If

        If Ret <> 0 Then
            'エラーコードからエラーメッセージを取得
            sError = String$(260, Chr$(0))
            Ret = Api_FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0, Ret, 0, sError, Len(sError), 0)
            A% = MessageBox(GetWindowText, "エラー!", 0, 2)
        Else
            MSG = MSG & "「" & SubKey & "」に" & Chr$(13, 10) & Chr$(13, 10)
            MSG = MSG & FileName & " を登録しました!"
            A% = MessageBox(GetWindowText, MSG, 0, 2)
        End If
    Else
        'エラーコードからエラーメッセージを取得
        sError = String$(260, Chr$(0))
        Ret = Api_FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0, hKey, 0, sError, Len(sError), 0)
        A% = MessageBox(GetWindowText, sError, 0, 2)
    End If
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End