[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/07/29(Fri) 17:28
投稿者名:さゆり
Eメール:
URL :
タイトル:
RegCreateKeyEx()の後にRegSetValueNumEx()を使ってレジストリに書き込みたい(全ソース付き)
RegCreateKeyEx()の後にRegSetValueNumEx()を使ってレジストリに書き込みたいのですが
なぜか、うまくいきません。
エラーも出ていないです。
何か使い方が悪いのでしょうか?

以下、ソースです。ボタンを1つ作れば確認はできます。
----------------------------------------
Private Const ERROR_SUCCESS = 0                         '成功した場合
Private Type SECURITY_ATTRIBUTES
    nLength As Long                                     '構造体のバイト数
    lpSecurityDescriptor As Long                        'セキュリティデスクリプタ(Win95,98,
Me
では無効)
    bInheritHandle As Long                              '1のとき、属性を継承する
End Type

'指定のキーを作成する、キーが存在する場合はそのキーをオープンする
Private Declare Function RegCreateKeyEx Lib "ADVAPI32.dll" Alias "RegCreateK
eyExA" _
        (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, _
        ByVal lpClass As String, ByVal dwOptions As Long, _
        ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _
        phkResult As Long, lpdwDisposition As Long) As Long
Private Declare Function RegSetValueNumEx Lib "advapi32" Alias "RegSetValueE
xA" (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

'hKeyの定数
Private Const HKEY_CLASSES_ROOT = &H80000000            'ソフトウェアの設定情報
Private Const HKEY_CURRENT_USER = &H80000001            '現在のハードウェアの設定情報
Private Const HKEY_LOCAL_MACHINE = &H80000002           'ローカルコンピュータに関する情

Private Const HKEY_USERS = &H80000003                   '全てのユーザーの環境設定情報
Private Const HKEY_PERFORMANCE_DATA = &H80000004        'パフォーマンスデータ(windowに
関する設
定?)→どの書籍にも見当たらない
Private Const HKEY_CURRENT_CONFIG = &H80000005          '特定のユーザーの環境設定情報
Private Const HKEY_DYN_DATA = &H80000006                'デバイスのステータス情報
'dwOptionsの定数
Private Const REG_OPTION_NON_VOLATILE = 0               '設定内容をレジストリに保存
Private Const REG_OPTION_VOLATILE = 1                   '(この定数は無効らしい)
Private Const REG_OPTION_BACKUP = 4                     '(同上)
'samDesiredの定数
Private Const KEY_CREATE_LINK = &H20                    'キーオブジェクトとのリンクを作
成する
Private Const KEY_ENUMERATE_SUB_KEYS = &H8              'サブキーを列挙する
Private Const KEY_QUERY_VALUE = &H1                     'レジストリの値を取得する
Private Const KEY_SET_VALUE = &H2                       'レジストリの値を設定する
Private Const KEY_CREATE_SUB_KEY = &H4                  'サブキーを作成する
Private Const KEY_NOTIFY = &H10                         'レジストリの内容変更通知を要求
する
'lpdwDispositionの戻り値
Private Const REG_CREATED_NEW_KEY = &H1                 'キーを新規作成
Private Const REG_OPENED_EXISTRING_KEY = &H2            '既存キーをオープンする

'レジストリキーのハンドルを解放する
Private Declare Function RegCloseKey Lib "ADVAPI32.dll" _
        (ByVal hKey As Long) As Long
'メッセージの文字列を指定の書式で取得する
Private Declare Function FormatMessage Lib "kernel32.dll" Alias "FormatMessa
geA" _
    (ByVal dwFlags As Long, ByVal lpSource As Any, ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, ByVal lpBuffer As String, _
    ByVal nSize As Long, Arguments As Long) As Long
'dwFlagsの定数
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100            'nSizeデ指定したサイズ
のバッ
ファを確保する
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200             'バッファに引数を挿入し
ない
Private Const FORMAT_MESSAGE_FROM_STRING = &H400                'lpSourceはメッセージを
定義す
る文字列
                                                                '(FORMAT_MESSAGE_FROM_HMODU
L
E、または
                                                                ' FORMAT_MESSAGE_FROM_SYSTE
M
と組み合わせ不可)
Private Const FORMAT_MESSAGE_FROM_MODULE = &H800                'lpSouceはメッセージテ
ーブル
リソースを
                                                                '持つモジュールのハンドル
                                                                '(FORMAT_MESSAGE_FROM_STRIN
G
と組み合わせ不可)
                                                                'lpSourceが0のとき、カレン
トプ
ロセスの
                                                                'モジュールを検索する
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000               'システムメッセージリソ
ースを
検索する
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000            'Argumentはva_list構造
体では
ない。

'(dwFlagsの下位バイトの意味を指定する定数)
'0                                                              'すべての文字を出力する
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF              '出力する最大バイト数
'0 でも& HFFでもないとき                                        'メッセージ中の改行を無
視する
Private Sub Command1_Click()
Dim rc As Long, sError As String
Dim lngResult As Long, lngDisposition As Long
Dim udtSECURITY_ATTRIBUTES As SECURITY_ATTRIBUTES

'レジストリにキーを作成する
rc = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\WinAPI\ReistryTest", 0&, vbN
ullString, _
    REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, udtSECURITY_ATTRIBUTES, lngResult,
lngDisposition)

If rc = ERROR_SUCCESS Then
    If lngDisposition = REG_CREATED_NEW_KEY Then
        MsgBox "HKEY_CURRENT_USER\Software\WinAPI\ReistryTestにキーを作成しました"
;
    Else
        MsgBox "HKEY_CURRENT_USER\Software\WinAPI\ReistryTestのキーをオープンしました&
quot;
    End If
Else
    'エラーコードからエラーメッセージを取得
    sError = String(260, vbNullChar)
    Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, rc, 0, sError, Len(sError)
, 0)
    MsgBox sError
End If
    Call RegSetValueNumEx(lngResult, "TEST", 0, REG_DWORD, 1, 4)
    Call RegCloseKey(hKey)
End Sub

投稿時間:2005/07/29(Fri) 17:31
投稿者名:さゆり
Eメール:
URL :
タイトル:
全ソースです。すいません
改行位置かおかしかったので再投稿します。
すいません。

Private Const ERROR_SUCCESS = 0                         '成功した場合
Private Type SECURITY_ATTRIBUTES
    nLength As Long                                     '構造体のバイト数
    lpSecurityDescriptor As Long                        'セキュリティデスクリプタ(Win95,98,Meで
は無効)
    bInheritHandle As Long                              '1のとき、属性を継承する
End Type

'指定のキーを作成する、キーが存在する場合はそのキーをオープンする
Private Declare Function RegCreateKeyEx Lib "ADVAPI32.dll" Alias "RegCreateKeyExA" _
        (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, _
        ByVal lpClass As String, ByVal dwOptions As Long, _
        ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _
        phkResult As Long, lpdwDisposition As Long) As Long
Private Declare Function RegSetValueNumEx Lib "advapi32" 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

'hKeyの定数
Private Const HKEY_CLASSES_ROOT = &H80000000            'ソフトウェアの設定情報
Private Const HKEY_CURRENT_USER = &H80000001            '現在のハードウェアの設定情報
Private Const HKEY_LOCAL_MACHINE = &H80000002           'ローカルコンピュータに関する情報
Private Const HKEY_USERS = &H80000003                   '全てのユーザーの環境設定情報
Private Const HKEY_PERFORMANCE_DATA = &H80000004        'パフォーマンスデータ(windowに関する設
定?)→どの書籍にも見当たらない
Private Const HKEY_CURRENT_CONFIG = &H80000005          '特定のユーザーの環境設定情報
Private Const HKEY_DYN_DATA = &H80000006                'デバイスのステータス情報
'dwOptionsの定数
Private Const REG_OPTION_NON_VOLATILE = 0               '設定内容をレジストリに保存
Private Const REG_OPTION_VOLATILE = 1                   '(この定数は無効らしい)
Private Const REG_OPTION_BACKUP = 4                     '(同上)
'samDesiredの定数
Private Const KEY_CREATE_LINK = &H20                    'キーオブジェクトとのリンクを作成する
Private Const KEY_ENUMERATE_SUB_KEYS = &H8              'サブキーを列挙する
Private Const KEY_QUERY_VALUE = &H1                     'レジストリの値を取得する
Private Const KEY_SET_VALUE = &H2                       'レジストリの値を設定する
Private Const KEY_CREATE_SUB_KEY = &H4                  'サブキーを作成する
Private Const KEY_NOTIFY = &H10                         'レジストリの内容変更通知を要求する
'lpdwDispositionの戻り値
Private Const REG_CREATED_NEW_KEY = &H1                 'キーを新規作成
Private Const REG_OPENED_EXISTRING_KEY = &H2            '既存キーをオープンする

'レジストリキーのハンドルを解放する
Private Declare Function RegCloseKey Lib "ADVAPI32.dll" _
        (ByVal hKey As Long) As Long
'メッセージの文字列を指定の書式で取得する
Private Declare Function FormatMessage Lib "kernel32.dll" Alias "FormatMessageA" _
    (ByVal dwFlags As Long, ByVal lpSource As Any, ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, ByVal lpBuffer As String, _
    ByVal nSize As Long, Arguments As Long) As Long
'dwFlagsの定数
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100            'nSizeデ指定したサイズのバッフ
ァを確保する
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200             'バッファに引数を挿入しない
Private Const FORMAT_MESSAGE_FROM_STRING = &H400                'lpSourceはメッセージを定義する
文字列
                                                                '(FORMAT_MESSAGE_FROM_HMODULE
、または
                                                                ' FORMAT_MESSAGE_FROM_SYSTEMと
組み合わせ不可)
Private Const FORMAT_MESSAGE_FROM_MODULE = &H800                'lpSouceはメッセージテーブルリ
ソースを
                                                                '持つモジュールのハンドル
                                                                '(FORMAT_MESSAGE_FROM_STRINGと
組み合わせ不可)
                                                                'lpSourceが0のとき、カレントプロ
セスの
                                                                'モジュールを検索する
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000               'システムメッセージリソースを検
索する
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000            'Argumentはva_list構造体ではな
い。

'(dwFlagsの下位バイトの意味を指定する定数)
'0                                                              'すべての文字を出力する
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF              '出力する最大バイト数
'0 でも& HFFでもないとき                                        'メッセージ中の改行を無視する
Private Sub Command1_Click()
Dim rc As Long, sError As String
Dim lngResult As Long, lngDisposition As Long
Dim udtSECURITY_ATTRIBUTES As SECURITY_ATTRIBUTES

'レジストリにキーを作成する
rc = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\WinAPI\ReistryTest", 0&, vbNullString, _
    REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, udtSECURITY_ATTRIBUTES, lngResult,
lngDisposition)

If rc = ERROR_SUCCESS Then
    If lngDisposition = REG_CREATED_NEW_KEY Then
        MsgBox "HKEY_CURRENT_USER\Software\WinAPI\ReistryTestにキーを作成しました"
    Else
        MsgBox "HKEY_CURRENT_USER\Software\WinAPI\ReistryTestのキーをオープンしました"
    End If
Else
    'エラーコードからエラーメッセージを取得
    sError = String(260, vbNullChar)
    Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, rc, 0, sError, Len(sError), 0)
    MsgBox sError
End If
    Call RegSetValueNumEx(lngResult, "TEST", 0, REG_DWORD, 1, 4)
    Call RegCloseKey(hKey)
End Sub

投稿時間:2005/07/29(Fri) 18:45
投稿者名:いな
Eメール:
URL :
タイトル:
コード投稿モード(図表モード)
> 改行位置かおかしかったので再投稿します。
> すいません。

改行位置もさることながら、
コード投稿モード(図表モード)って言うのがあるので
それで投稿してもらえると、インデントがそろうので、読みやすいです。

あと、再投稿でなく、「修正」でよかったのでは?

投稿時間:2005/07/29(Fri) 19:17
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re: RegCreateKeyEx()の後にRegSetValueNumEx()を使ってレジストリに書き込みたい(全ソース付き)
> RegCreateKeyEx()の後にRegSetValueNumEx()を使ってレジストリに書き込みたいのですが
> なぜか、うまくいきません。
> エラーも出ていないです。
> 何か使い方が悪いのでしょうか?

 RegCreateKeyExは、戻り値を見てエラーの場合は、エラーメッセージまで表示しているのに
RegSetValueNumExは、戻り値を見ていません。RegCreateKeyExと同様に、エラーをチェックすれば
エラーメッセージが表示されますよ。

投稿時間:2005/07/30(Sat) 10:25
投稿者名:さゆり
Eメール:
URL :
タイトル:
図表モードでのソース投稿
すいません。見やすいように図表モードで投稿しました。
また、エラー判定も追加しました。
RegSetValueNumEx()はエラーコード5が返ってきてました。
正直なところ、どのように修正したらよいのかわからなくなっています。
みなさんのお知恵をお借りしたいのです。お願いいたします。

----------------------
Private Const ERROR_SUCCESS = 0                         '成功した場合
Private Type SECURITY_ATTRIBUTES
    nLength As Long                                     '構造体のバイト数
    lpSecurityDescriptor As Long                        'セキュリティデスクリプタ(Win95,98,Me
では無効)
    bInheritHandle As Long                              '1のとき、属性を継承する
End Type

'指定のキーを作成する、キーが存在する場合はそのキーをオープンする
Private Declare Function RegCreateKeyEx Lib "ADVAPI32.dll" Alias "RegCreateKeyExA" _
        (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, _
        ByVal lpClass As String, ByVal dwOptions As Long, _
        ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _
        phkResult As Long, lpdwDisposition As Long) As Long
Private Declare Function RegSetValueNumEx Lib "advapi32" 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

'hKeyの定数
Private Const HKEY_CLASSES_ROOT = &H80000000            'ソフトウェアの設定情報
Private Const HKEY_CURRENT_USER = &H80000001            '現在のハードウェアの設定情報
Private Const HKEY_LOCAL_MACHINE = &H80000002           'ローカルコンピュータに関する情報
Private Const HKEY_USERS = &H80000003                   '全てのユーザーの環境設定情報
Private Const HKEY_PERFORMANCE_DATA = &H80000004        'パフォーマンスデータ(windowに関する設
定?)→どの書籍にも見当たらない
Private Const HKEY_CURRENT_CONFIG = &H80000005          '特定のユーザーの環境設定情報
Private Const HKEY_DYN_DATA = &H80000006                'デバイスのステータス情報
'dwOptionsの定数
Private Const REG_OPTION_NON_VOLATILE = 0               '設定内容をレジストリに保存
Private Const REG_OPTION_VOLATILE = 1                   '(この定数は無効らしい)
Private Const REG_OPTION_BACKUP = 4                     '(同上)
'samDesiredの定数
Private Const KEY_CREATE_LINK = &H20                    'キーオブジェクトとのリンクを作成する
Private Const KEY_ENUMERATE_SUB_KEYS = &H8              'サブキーを列挙する
Private Const KEY_QUERY_VALUE = &H1                     'レジストリの値を取得する
Private Const KEY_SET_VALUE = &H2                       'レジストリの値を設定する
Private Const KEY_CREATE_SUB_KEY = &H4                  'サブキーを作成する
Private Const KEY_NOTIFY = &H10                         'レジストリの内容変更通知を要求する
'lpdwDispositionの戻り値
Private Const REG_CREATED_NEW_KEY = &H1                 'キーを新規作成
Private Const REG_OPENED_EXISTRING_KEY = &H2            '既存キーをオープンする

'レジストリキーのハンドルを解放する
Private Declare Function RegCloseKey Lib "ADVAPI32.dll" _
        (ByVal hKey As Long) As Long
'メッセージの文字列を指定の書式で取得する
Private Declare Function FormatMessage Lib "kernel32.dll" Alias "FormatMessageA" _
    (ByVal dwFlags As Long, ByVal lpSource As Any, ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, ByVal lpBuffer As String, _
    ByVal nSize As Long, Arguments As Long) As Long
'dwFlagsの定数
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100            'nSizeデ指定したサイズのバッフ
ァを確保する
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200             'バッファに引数を挿入しない
Private Const FORMAT_MESSAGE_FROM_STRING = &H400                'lpSourceはメッセージを定義す
る文字列
                                                                '(FORMAT_MESSAGE_FROM_HMODULE
、または
                                                                ' FORMAT_MESSAGE_FROM_SYSTEMと
組み合わせ不可)
Private Const FORMAT_MESSAGE_FROM_MODULE = &H800                'lpSouceはメッセージテーブルリ
ソースを
                                                                '持つモジュールのハンドル
                                                                '(FORMAT_MESSAGE_FROM_STRINGと
組み合わせ不可)
                                                                'lpSourceが0のとき、カレントプ
ロセスの
                                                                'モジュールを検索する
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000               'システムメッセージリソースを
検索する
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000            'Argumentはva_list構造体ではな
い。

'(dwFlagsの下位バイトの意味を指定する定数)
'0                                                              'すべての文字を出力する
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF              '出力する最大バイト数
'0 でも& HFFでもないとき                                        'メッセージ中の改行を無視する
Private Sub Command1_Click()
Dim rc As Long, sError As String
Dim lngResult As Long, lngDisposition As Long
Dim udtSECURITY_ATTRIBUTES As SECURITY_ATTRIBUTES

'レジストリにキーを作成する
rc = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\WinAPI\ReistryTest", 0&, vbNullString, _
    REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, udtSECURITY_ATTRIBUTES, lngResult,
lngDisposition)

If rc = ERROR_SUCCESS Then
    If lngDisposition = REG_CREATED_NEW_KEY Then
        MsgBox "HKEY_CURRENT_USER\Software\WinAPI\ReistryTestにキーを作成しました"
    Else
        MsgBox "HKEY_CURRENT_USER\Software\WinAPI\ReistryTestのキーをオープンしました"
    End If
Else
    'エラーコードからエラーメッセージを取得
    sError = String(260, vbNullChar)
    Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, rc, 0, sError, Len(sError), 0)
    MsgBox sError
End If
    If RegSetValueNumEx(lngResult, "TEST", 0, REG_DWORD, 1, 4) <> ERROR_SUCCESS Then
        MsgBox "RegSetValueNumExエラーです"
    End If
    Call RegCloseKey(hKey)
End Sub

投稿時間:2005/07/31(Sun) 19:47
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re: 図表モードでのソース投稿
> すいません。見やすいように図表モードで投稿しました。
> また、エラー判定も追加しました。
> RegSetValueNumEx()はエラーコード5が返ってきてました。

 FormatMessageを使えば、内容がわかりますけど。

> 正直なところ、どのように修正したらよいのかわからなくなっています。
> みなさんのお知恵をお借りしたいのです。お願いいたします。

 RegCreateKeyEx の 6番目のパラメータに、KEY_SET_VALUE のビットがたっていないためです。
とりあえず、KEY_ALL_ACCESS を指定してやれば、その後何でもできる思います。

 ところで、RegSetValueEx を RegSetValueNumEx の名前で使用しているのは、なぜでしょうか?