|
APIからレジストリデータを取りたいと思っております
レジストリの項目が分かっているときに RegOpenKeyExA RegQueryValueExA では正常に取得できていますが、項目が分からないため、一覧を取得しようとすると RegQueryInfoKey RegEnumValueEx RegEnumKeyEx 上記関数でいずれも NOT DLL FUNCTION が出てエラーとなってしまいます。
データ型や指定方法が分かる方、教えていただけませんでしょうか。 FILETIME指定の箇所は {var dword, var dword} でも試しましたがこれもうまくいきませんでした。
Windos2000ではREGコマンドが無く、この方法でしか取得できず、困っております。
Dim Handle Dim Time[1]
Dim BufA[4] = 2147483650, "SOFTWARE\Microsoft\Updates\", 1, 0 DEF_DLL RegOpenKeyExA( hwnd, string, dword, dword, var hwnd ) : long : Advapi32.dll Print RegOpenKeyExA( BufA[0], BufA[1], 0, BufA[2], Handle )
Print Handle
Dim BufB[4] = "test", 0, 0, 0 DEF_DLL RegQueryValueExA( hwnd, string, dword, var dword,_ var pbyte, var dword) : long : Advapi32.dll Print RegQueryValueExA(Handle, BufB[0], 0, BufB[1], BufB[2], BufB[3]) )
//ここまでは正常に動きます
Dim BufC[9] = "test", 1255, 0, 1, 1, 0, 0, 0, 0, 0 DEF_DLL RegQueryInfoKey( hwnd, var string, var dword, dword,_ var dword, var dword, var dword, var dword, var dword,_ var dword, var dword, var dword[]) : long : Advapi32.dll MsgBox( RegQueryInfoKey( Handle, BufC[0], BufC[1], NULL, BufC[2],_ BufC[3], BufC[4], BufC[5], BufC[6], BufC[7], BufC[8], Time ) )
Dim BufD[5] = "test", 1255, 0, 0, 1256 DEF_DLL RegEnumValueEx( hwnd, dword, var string, var dword,_ dword, var dword, var pchar, var dword) : long : Advapi32.dll MsgBox( RegEnumValueEx( Handle, 0, BufD[0], BufD[1], NULL, BufD[2], BufD[3], BufD[4]) )
Dim BufE[5] = "test", 1255, NULL, 0, 1256 DEF_DLL RegEnumKeyEx( hwnd, dword, var string, var dword,_ var dword, var string, var dword, var dword[]) : long : Advapi32.dll MsgBox( RegEnumKeyEx( Handle, 0, BufE[0], BufE[1], BufE[2], BufE[3], BufE[4], Time ) )
|
No.4585 2017/10/23(Mon) 17:16:58
|
☆ Re: DEFF_DLL で教えてください / stuncloud |
|
|
> 上記関数でいずれも NOT DLL FUNCTION が出てエラーとなってしまいます。 については > Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装 なので > RegQueryInfoKey > RegEnumValueEx > RegEnumKeyEx はそれぞれ RegQueryInfoKeyA RegEnumValueExA RegEnumKeyExA にする必要があるんじゃないかと思います # あとRegEnumValueExてあるんですかね、msdn見たらRegEnumValueしかなかったんですが
レジストリに関してはWMIを使ったほうが簡単かもしれないですよ
|
No.4586 2017/10/23(Mon) 18:02:41
|
|
☆ Re: DEFF_DLL で教えてください / えあり |
|
|
早速の回答ありがとうございます。 RegQueryInfoKeyAとしたところ、この関数は動作いたしました。 が、やはりRegEnumValueExAおよびRegEnumKeyExAは動作しないようです。
個人的にはFILETIMEの構造体の部分が怪しいとにらんでいるのですが この場合、指定方法が間違っているかどうかも含めて どのように検証したらよいのか見当がつきません。
引き続き、お願いいたします。
|
No.4588 2017/10/23(Mon) 19:06:36
|
|
☆ Re: DEFF_DLL で教えてください / stuncloud |
|
|
すいません、winapiを試してたんですが僕のめんどくさい閾値を越えてしまったのでWMIのサンプルを書いてみました サブキーまでわかっていてエントリがわからない状態でエントリ名の列挙と値の取得をしています (REG_SZ、REG_DWORDのみ) ただ使う分にはこんなにめんどくさくないんですが、WOW64対策を入れてるのでこんなことになっています 今回は書き込みを行ってないので関係ないんですが、HKCU以外への書き込みを行う場合はUWSCを「管理者として実行する」必要があります
objCtx = CreateOleObj("WbemScripting.SWbemNamedValueSet") objCtx.Add("__ProviderArchitecture", 32) // 32ビットを指定 objLocator = CreateOleObj("Wbemscripting.SWbemLocator") objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx) objStdRegProv = objServices.Get("StdRegProv") InparamsEnum = objStdRegProv.Methods_("EnumValues").Inparameters InparamsEnum.Hdefkey = HKEY_LOCAL_MACHINE InparamsEnum.Ssubkeyname = "SOFTWARE\Umiumi\UWSC\" // 32ビットを指定したため64ビットOS上でもWOW6432Nodeのパスを指定する必要がない // InparamsEnum.Ssubkeyname = "SOFTWARE\WOW6432Node\Umiumi\UWSC\" OutparamsEnum = objStdRegProv.ExecMethod_("EnumValues", InparamsEnum, , objCtx)
if OutparamsEnum.ReturnValue = 0 then for i = 0 to length(OutparamsEnum.sNames) - 1 print OutparamsEnum.sNames[i] select OutparamsEnum.Types[i] case REG_SZ method = "GetStringValue" case REG_DWORD method = "GetDWORDValue" selend InparamsRead = objStdRegProv.Methods_(method).Inparameters InparamsRead.Hdefkey = HKEY_LOCAL_MACHINE InparamsRead.Ssubkeyname = "SOFTWARE\WOW6432Node\Umiumi\UWSC\" InparamsRead.sValueName = OutparamsEnum.sNames[i] OutparamsRead = objStdRegProv.ExecMethod_(method, InparamsRead, , objCtx) if OutparamsRead.ReturnValue = 0 then select OutparamsEnum.Types[i] case REG_SZ print OutparamsRead.sValue case REG_DWORD print OutparamsRead.uValue selend endif print next endif
const HKEY_CLASSES_ROOT = $80000000 const HKEY_CURRENT_USER = $80000001 const HKEY_LOCAL_MACHINE = $80000002 const HKEY_USERS = $80000003 const HKEY_PERFORMANCE_DATA = $80000004 const HKEY_PERFORMANCE_TEXT = $80000050 const HKEY_PERFORMANCE_NLSTEXT = $80000060 const HKEY_CURRENT_CONFIG = $80000005 const HKEY_DYN_DATA = $80000006 const HKEY_CURRENT_USER_LOCAL_SETTINGS = $80000007
const REG_SZ = 1 const REG_EXPAND_SZ = 2 const REG_BINARY = 3 const REG_DWORD = 4 const REG_MULTI_SZ = 7 const REG_QWORD = 11
これもだいぶめんどくさい感じなんですけどwinapiよりはまだ気楽に扱えます…
|
No.4592 2017/10/25(Wed) 12:23:01
|
|