これは、ASP(Active Server Pages) & WSH などで利用できる COM コンポーネントです




はじめに
WSH には、レジストリ・アクセス用のオブジェクトが用意されていますが、サブキーの一覧を取得する事が出来ないですよね。

という事で、レジストリパスを指定した上でそのサブキー(または値の名前)の一覧を取得する機能に特化した COM コンポーネントです。

REG_BINARY などのデータ型のデータを取得/設定できるように関数を追加した。


使用方法
  1. ここで配布されている共通コンポーネント sCOMmon.dll をダウンロードして、システム・ディレクトリ(%SystemRoot%\System32 {Win64 → %SystemRoot%\SysWOW64})にコピーします。
  2. ファイルをダウンロードします。
  3. ダウンロードしたファイルを解凍しします。
    (LHAは、吉崎栄泰氏が、著作権を所有)
  4. SRegCore.dll をシステム・ディレクトリ(%SystemRoot%\System32 {Win64 → %SystemRoot%\SysWOW64})にコピー
  5. SReg.dll を任意のディレクトリにコピー。
  6. コピーされたディレクトリで、regsvr32.exe を実行してレジストリに登録。
  7. (同梱されている regsvr32.bat を SReg.dllと同一ディレクトリにコピーして実行することでも可能。
  8. 以上で、
    VBScript,JScript,VisualBASIC にて、この COM コンポーネントを利用可能。



アンインストール方法
RegSvr32 コマンドの /u オプションを用いて、SReg.dll をレジストリから削除して、SReg.dll を削除すればいいです。
SRegCore.dll, sCOMmon.DLL も必要なければ、削除する


開発環境など
MS VC++ ver6.0 ATL COM Wizard にて作成。
winreg.h,comdef.h をインクルードしている。

ReleaseMiniSize でビルドする時に、プリプロセッサの定義から「_ATL_MIN_CRT」を外した


処理内容など
SetKey() メソッドでレジストリ・ハンドル(READ 権限)を取得後、
API RegQueryInfoKey() にて、各種情報を取得。グローバル変数に確保しておきます。

グローバル変数内のレジストリ・ハンドル hKey で、サブキーの値などを取得しますが、
hKey がきちんと設定されているかどうかは、 chk の値で判断します。

chk = 0 : きちんと設定されていない。
chk = 1 : 設定されているので、各種メソッドが実行可能。


免責など
著作権はとりあえず保持します。
このソフトを使用したことによって生じた、
いかなる損害についても責任は持ちません。
ソースコードについても、各自の責任において、
自由にいじってくれてもいいです。

DownLoad(SReg.lzh as 173,460byte) (SReg.lzh.base64)
SReg.dll is 69,632byte(ver3.0.0.2)

SRegCore.dll is 61,440byte(ver3.0.0.2)

...なぜか未だに、デバグ情報付のコンパイルをしている...


変更履歴



その他のレジストリアクセス
WSH には、レジストリ・アクセス用のオブジェクトがあるので、それを使って値の取得、設定、削除を実施すればいい。

WshShell オブジェクト
RegRead(レジストリパス) レジストリパスに指定された値を読み取る
RegDelete(レジストリパス) レジストリパスに指定された所から全て削除する
RegWrite(レジストリパス,値,レジストリタイプ) レジストリパスに指定された所に値を設定する


WshShell オブジェクトのルートキーの指定方法
そのまま長い文字列で指定してもいいが、以下の短縮文字列で指定もできる。
ルート名 短縮形による指定方法
HKEY_CURRENT_USER HKCU
HKEY_LOCAL_MACHINE HKLM
HKEY_CLASSES_ROOT HKCR


WshShell オブジェクトで使用できるレジストリタイプ


ASP での WshShell オブジェクトの使用方法
こんなんでどうでしょ?
<%
Dim Obj

Set Obj = Server.CreateObject("Wscript.Shell.1")

あとは、いろいろと....

Set Obj = Nothing
%>



メソッドの詳細は、下記に譲って....
ちょっとしたサンプル


サンプル・コードとしては、WSH としますね。

例えば、HKEY_LOCAL_MACHINE\Software 以下のサブキーの一覧が欲しい。
サブキーの数を取得して、その回数をループさせる
Dim Obj
Dim RegPath
Dim Max
Dim i
Dim ret

REM レジストリ・パスをセット
RegPath = "HKLM\Software"

REM オブジェクトを生成
Set Obj = WScript.CreateObject("SReg.GetList.1")

REM レジストリ・パスをオブジェクトに伝達
Obj.SetKey(RegPath)

REM きちんとセットされているなら
If Not Obj.IsError() = 0 Then
WScript.Quit
End If
REM サブキーの個数を取得
Max = Obj.GetKeyNum()

REM 取得した回数分ループ
For i=0 To Max-1
ret = Obj.GetSubKey()
WScript.Echo "サブキー名 = " & ret
Next

REM オブジェクトを解放
Set Obj = Nothing
IsError 値で判断してループを止める
Dim Obj
Dim RegPath
Dim chk
Dim ret

REM レジストリ・パスをセット
RegPath = "HKLM\Software"

REM オブジェクトを生成
Set Obj = WScript.CreateObject("SReg.GetList.1")

REM レジストリ・パスをオブジェクトに伝達
Obj.SetKey(RegPath)

REM きちんとセットされているなら
If Not Obj.IsError() = 0 Then
WScript.Quit
End If

REM IsError 値で判断
chk = 0
While chk = 0
ret = Obj.GetSubKey()
WScript.Echo "サブキー名 = " & ret
ret = IsError()
If ret = 8 Then
chk = 1
ElseIf Not ret = 0 Then
chk = 1
End If
Wend

REM オブジェクトを解放
Set Obj = Nothing
CSV 形式で取得してしまう
Dim Obj
Dim RegPath
Dim ret

REM レジストリ・パスをセット
RegPath = "HKLM\Software"

REM オブジェクトを生成
Set Obj = WScript.CreateObject("SReg.GetList.1")

REM レジストリ・パスをオブジェクトに伝達
Obj.SetKey(RegPath)

REM きちんとセットされているなら
If Not Obj.IsError() = 0 Then
WScript.Quit
End If

REM CSV 形式で取得
REM エスケープ処理はしていないので、
REM キー名で ",(カンマ)" があるとヤバイ
ret = Obj.GetAllSubKey()
WScript.Echo "サブキー一覧 = " & ret

REM オブジェクトを解放
Set Obj = Nothing

メソッド一覧
SReg.dll [COM|ActiveXdll]


SetKey(文字列)
内容 一覧を取得するレジストリ・パスをセットする。
CreateObject 後は、まずこのメソッドでレジストリパスをセットする。
この COM コンポーネントは、このパス(正確には、レジストリ・ハンドル)を記録する。
引数 一覧を取得したいレジストリパス
戻り値 なし
IsError 値
成功 0
失敗 負数
レジストリのルート・パスには、以下の省略が可能。
  • HKCR => HKEY_CLASSES_ROOT
  • HKCU => HKEY_CURRENT_USER
  • HKU ==> HKEY_USERS
  • HKLM => HKEY_LOCAL_MACHINE

ver1.0.0.1 では、大文字小文字の判別をしているので、ルートキーは大文字のみ可。
ルートキー以外のレジストリ・パスは、大文字/小文字どちらでも可。


GetSubKey()
内容 サブキー名を一つ取得する。
内部的にカウンタ(GetValueName() のものとは別物)を保持しており、このメソッドを何度も発行する事で、全てのサブキー名を取得する事が可能。
内部的なカウンタは、SetKey() メソッドの発行によって初期化される。
引数 なし
戻り値 サブキー名
IsError 値
成功 0 : 成功しました。
-705 : 成功しました。サブキーはこれが最後です。
失敗 負数


GetValueName()
内容 値の名前を一つ取得する。
内部的にカウンタ(GetSubKey() のものとは別物)を保持しており、このメソッドを何度も発行する事で、全てのサブキー名を取得する事が可能。
内部的なカウンタは、SetKey() メソッドの発行によって初期化される。
引数 なし
戻り値 値の名前
IsError 値
成功 0 : 成功しました。
-705 : 成功しました。値はこれが最後です。
失敗 負数


GetValueRegType()
内容 直前の GetValueName() によって取得した値のレジストリタイプを取得する。
引数 なし
戻り値 直前の GetValueName() によって取得した値のレジストリタイプ
戻される値は文字列で
  • REG_BINARY
  • REG_DWORD
  • REG_DWORD_LITTLE_ENDIAN
  • REG_DWORD_BIG_ENDIAN
  • REG_EXPAND_SZ
  • REG_LINK
  • REG_MULTI_SZ
  • REG_NONE
  • REG_SZ
これ以外の場合、空文字列が返る。
IsError 値
なし。
この直後に、IsError() メソッドを発行した場合、このメソッドの直前のメソッドの IsError 値が返る。
つまり、IsError() メソッドで取得する変数をいじっていないという事です。


GetAllSubKey()
内容 CSV 形式でサブキー名の一覧を取得する。
ただし、",(カンマ)" についてのエスケープ処理は施していないので、",(カンマ)" を名前に含んでいる可能性がある場合、注意を要する。
引数 なし
戻り値 CSV 形式のサブキー名の一覧
IsError 値
成功 0 : 成功しました。
失敗 負数


GetAllValueName()
内容 CSV 形式で値の名前の一覧を取得する。
ただし、",(カンマ)" についてのエスケープ処理は施していないので、",(カンマ)" を名前に含んでいる可能性がある場合、注意を要する。
引数 なし
戻り値 CSV 形式の値の名前の一覧
IsError 値
成功 0 : 成功しました。
失敗 負数


GetKeyNum()
内容 指定されたレジストリパス直下のサブキーの個数を返す。
引数 なし
戻り値 指定されたレジストリパス直下のサブキーの個数。
IsError 値
成功 0 : 成功しました。
失敗 負数


GetValueNum()
内容 指定されたレジストリパス直下の値の個数を返す。
引数 なし
戻り値 指定されたレジストリパス直下の値の個数。
IsError 値
成功 0 : 成功しました。
失敗 負数


SetValue()
内容 指定されたレジストリパス直下に指定した値、またはサブキーを作成する。
引数
第一引数
値の名前

第ニ引数
値のレジストリ・タイプ
空の場合、サブキーを作成する(空文字列の場合は未実装)
第三引数
値そのもの(バイナリとして扱う)

第一、第二引数には文字列を指定します。
第三引数は、バイト型配列として処理されます。
(第三引数に文字列などを指定する場合、ShiftJIS 化しておくなどの処理をしておく必要があります

前提として、既に SetKey() でレジストリオープン処理をしている必要があります。
戻り値 なし
IsError 値
成功 0 : 成功しました。
失敗 負数


GetValue()
内容 指定されたレジストリパス直下の指定した値を取得する。
引数
第一引数
値の名前

第一引数には文字列を指定します。
戻り値は、バイト型配列として処理されます。
(戻り値が文字列などの場合、ShiftJIS 化するなどの処理をする必要があります

第二引数
値のタイプ

前提として、既に SetKey() でレジストリオープン処理をしている必要があります。
戻り値 指定したレジストリ値の値(バイト型配列)
IsError 値
成功 0 : 成功しました。
失敗 負数


DeleteKey() (未実装)
内容 すでに SetKey() でオープン済みのレジストリパス直下の指定されたサブキー以下を削除します
WSH の RegDelete() との違いは、指定するサブキー下にサブキーがあっても、再帰的な処理をするので、一発で削除されます。
引数
第一引数
値の名前

第一引数には削除するサブキーの名前を指定します。
前提として、既に SetKey() でレジストリオープン処理をしている必要があります。
戻り値 なし
IsError 値
成功 0 : 成功しました。
失敗 負数


IsError()
内容 直前のメソッドが成功したかどうか。
引数 なし
戻り値 直前のメソッドが成功したかどうか
(() 内の数字が旧エラー番号)
0 以上 : 成功
負数 : エラー -1(10) : 予期しないエラー
-701(3) : 引数のレジストリ・パスが正しくない。
-702(4) : レジストリへのアクセスに失敗しました。本 COM コンポーネントには、READ アクセス権が必要です。
-703(5) : 指定するキーがセットされていない。SetKey() メソッドでレジストリ・パスを設定してください。
-704(6) : 正常なバッファサイズの取得に失敗しました。(負の値を取得しました)
-705(8) : 成功した。値はこれが最後です。 または、サブキー(または値)自体が存在しません。(0 個です)
-706(7) : サブキー(または値)・アクセスカウンタの値が不正(負、または大きすぎる)です。
-707(9) : サブキー(または値)の個数として不正な値(負数)を取得しちゃいました。
-708(11): レジストリタイプの指定が間違っています。

1 : メモリが確保できなかった。

詳細は、sError.h を参照




メソッド一覧
SRegCore.dll [C/C++]


signed long GetKeyHandle(unsigned char*,HKEY*)
第一引数で指定されたレジストリパスのハンドルを第二引数に返す
エラーの場合、負数を返す

signed long GetKeyInfo(HKEY*,unsigned long*,unsigned long*,unsigned long*,unsigned long*,unsigned long*,unsigned long*,FILETIME*)
第一引数で指定されたハンドルで指定されたレジストリの「サブキーの数」「サブキーの名前の最大の文字列長」「直下に存在する値の数」「直下に存在する値の名前の最大の文字列長」「直下に存在する値のデータの最大データサイズ」「キーのSecurityDescriptor のデータサイズ」「レジストリキーの最終書き込み時間」を返す(引数順)

signed long GetAllSubKeyOrValueName(HKEY*,unsigned char**,unsigned long,unsigned long,int)
第一引数で指定されたハンドルで指定されたレジストリの「サブキー|値の名前」の一覧を「,」区切りの CSV 形式で返す
第二引数には、未割り当て(NULLに初期化済)の文字列ポインタを渡すこと。関数内部で適切なサイズのメモリを確保して返す
第三引数には「個数」、第四引数には「単体の最大データサイズ」を指定する。
第三/第四引数が共に「0」の場合は、関数内部では OS からこれらのサイズを取得して、メモリを確保する。
第四引数 : 「0」の時→サブキー一覧、「1」の時→値一覧
エラーの時、負数が返る。成功の時、第二引数で確保したメモリサイズ(文字列終端コード含)



mail to active@window.goukaku.com