2015-01-19 2 views
2

32 비트 스크립팅 호스트에서 64 비트 레지스트리를 읽고 쓰는 데 아래 함수를 사용하고 있습니다.VB 스크립트에서 DWORD 레지스트리 키가 작동하지 않습니다.

이 잘 읽기 & 쓰기 문자열을 작동하지만, 내가 시도하고 DWORD를 사용할 때이 문자열로 작동

실패

strResult = WriteRegStr (Write_REG_SZ, HKEY_LOCAL_MACHINE, "Software\_TEST", "SubKey1", "1", 64) 

그러나이 아닌 DWORD로, 오류가 VBScript 런타임 오류입니다 : 개체가이 속성 또는 메서드를 suport하지 않습니다 'oInParams.sValue'는

strResult = WriteRegStr (Write_REG_DWORD, HKEY_LOCAL_MACHINE, "Software\_TEST", "SubKey1", 1, 64) 

하나를 감사합니다 DWORD 값의 속성이 uValue하지 sValue이기 때문이다

'--------------------------------------------------- 
' Declared Constants 
'--------------------------------------------------- 

Const wbemFlagReturnImmediately = &h10 
Const wbemFlagForwardOnly = &h20 
Const HKEY_LOCAL_MACHINE = &H80000002 
Const Read_REG_SZ = "GetStringValue" 
Const Write_REG_SZ = "SetStringValue" 
Const Read_REG_DWORD = "GetDWORDValue" 
Const Write_REG_DWORD = "SetDWORDValue" 
Const Success = 0 
Const Failure = 1 

'--------------------------------------------------- 
' Function Read Registry String 
'--------------------------------------------------- 

Function ReadRegStr (Method, RootKey, Key, Value, RegType) 
    Dim oCtx, oLocator, oReg, oInParams, oOutParams 

    Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet") 
    oCtx.Add "__ProviderArchitecture", RegType 

    Set oLocator = CreateObject("Wbemscripting.SWbemLocator") 
    Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv") 

    Set oInParams = oReg.Methods_(Method).InParameters 
    oInParams.hDefKey = RootKey 
    oInParams.sSubKeyName = Key 
    oInParams.sValueName = Value 

    Set oOutParams = oReg.ExecMethod_(Method, oInParams, , oCtx) 

    Select Case Method 
     Case "GetDWORDValue" : ReadRegStr = oOutParams.uValue 
     Case "GetStringValue" : ReadRegStr = oOutParams.sValue 
    End Select 


    'ReadRegStr = oOutParams.sValue 

    set oCtx = Nothing 
    set oLocator = Nothing 
End Function 

'--------------------------------------------------- 
' Function Write Registry String 
'--------------------------------------------------- 

Function WriteRegStr (Method, RootKey, Key, ValueName, Value, RegType) 

    Dim oCtx, oLocator, oReg, oInParams, oOutParams 

    Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet") 
    oCtx.Add "__ProviderArchitecture", RegType 

    Set oLocator = CreateObject("Wbemscripting.SWbemLocator") 
    Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv") 

    Set oInParams = oReg.Methods_(Method).InParameters 
    oInParams.hDefKey = RootKey 
    oInParams.sSubKeyName = Key 
    oInParams.sValueName = ValueName 
    oInParams.sValue = Value 

    Set oOutParams = oReg.ExecMethod_(Method, oInParams, , oCtx) 

    WriteRegStr = oOutParams.ReturnValue 

    Set oCtx = Nothing 
    Set oLocator = Nothing 

End Function 

답변

1

도움이됩니다.

당신은 Select Case 문이 처리 할 수 ​​: 당신이 ReadRegStr 기능에 oOutParam에 반환 된 데이터를 처리하기위한 동일한 필요

Select Case Method 
    Case "SetDWORDValue" : oInParams.uValue = Value 
    Case "SetStringValue" : oInParams.sValue = Value 
End Select 

참고.

하지만 솔직히 말해서 레지스트리 액세스에 대한 추상화를 시도하는 것은 잘못된 것이며 일반적인 WMI 메서드를 사용하는 것이 좋습니다. 추상화는 읽거나 쓰려고하는 값의 유형을 알 필요가없는 경우에만 도움이됩니다.

+0

감사합니다. 지금은 쓰기 기능이 작동 중이지만 여전히 읽기 기능과 관련하여 문제가 있습니까? 나는 처음 게시물에 함수를 업데이트했다. – user2130499

+0

@ user2130499'ReadRegStr' 함수의 수정을 의미합니까? 예, AFAICS를 사용해야합니다. 안전한면에서'Method'가 정의 된 문자열 중 하나가 아닌 상황을 처리하기 위해'Case Else'를'Select Case'에 추가 할 수 있습니다. –

+0

감사합니다. 방금 다시 확인했는데 작동하는 것 같습니다. 도움에 감사드립니다. – user2130499

관련 문제