'Programming/Visual Basic'에 해당되는 글 7건

  1. 2010.03.20 ASCII Code 표시
  2. 2010.03.20 윈도우 깜빡이기
  3. 2010.03.20 글자체 Byte 계산 소스
  4. 2010.03.20 작업표시줄 표시
  5. 2010.01.11 레지스트리 제어-3
  6. 2010.01.11 레지스트리 제어-2
  7. 2010.01.11 레지스트리 제어-1
ASCII Code 를 표시 하는 프로그램
Posted by koinit
,
윈도우를 깜빡이도록 하는 API 소스
소스를 사용하면 깜빡깜박 한다...

출처 :  http://www.vbnet.pe.kr
Posted by koinit
,
아래와 같이 하면 한글은 2 byte 로 영어와 숫자는 1 byte로 계산된다..

LenB(StrConv("가나12다라12A", vbFromUnicode))
Posted by koinit
,

Board Style 및 VbModal 시 작업표시줄에 표시.. 

Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)
Private Const SW_HIDE = 0
Private Const SW_NORMAL = 1

Private Const WS_EX_APPWINDOW = &H40000
Private Const WS_SYSMENU As Long = &H80000

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Sub GsShowInTaskBar(hwnd As Long, Flag As Boolean)

On Error GoTo GsShowInTaskBar_Error

    Dim WindowLong As Long
   
    ShowWindow hwnd, SW_HIDE
    WindowLong = GetWindowLong(hwnd, GWL_EXSTYLE)

    If Flag = True Then
        SetWindowLong hwnd, GWL_EXSTYLE, WindowLong Xor WS_EX_APPWINDOW
    Else
        SetWindowLong hwnd, GWL_EXSTYLE, WindowLong Or WS_EX_APPWINDOW
    End If

    ShowWindow hwnd, SW_NORMAL
   
    ' 시스템 메뉴 추가
    WindowLong = GetWindowLong(hwnd, GWL_STYLE)
    SetWindowLong hwnd, GWL_STYLE, WindowLong Or WS_SYSMENU
   
    Exit Sub

GsShowInTaskBar_Error:
    MsgBox Err.Description, vbCritical, "ModCommon1.GsShowInTaskBar()"
    Exit Sub
End Sub

Private Sub Form_Load()
    Call GsShowInTaskBar(Me.hwnd, True)
End Sub

Posted by koinit
,
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "clsDllRegister"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
'
' 이 파일은 기계어 클래스 생성기로 만들어졌습니다.
'
'     <DLL 등록> 모듈
'     작성자: 지상현(쥐씨당)
'
'     설명: ActiveX를 등록하거나 등록 해제한다.
'
'
' 만든 날짜: 2007-02-28
' 만든 시각: 오후 3:40:16
'
' 이 모듈에는 1개의 네이티브 함수가 있습니다.
' 모듈을 임의로 수정하지 마십시오.
'

Option Explicit

Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, src As Any, ByVal Length As Long)

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long

Public Enum ResultCode
    S_OK = 0&                       ' 성공
    
    ERROR_FILE_NOT_FOUND = 2&       ' 파일이 없음
    ERROR_FILE_INVALID = 1006&      ' 잘못된 파일 (DLL이 아니거나)
    ERROR_FILE_CORRUPT = 1392&      ' 잘못된 파일 (등록 가능한 DLL이 아니거나)
    
    E_UNEXPECTED = &H8000FFFF       ' 예상치 못한 오류
    E_OUTOFMEMORY = &H8007000E      ' 메모리가 부족함
    SELFREG_E_TYPELIB = &H200&      ' TypeLib 등록 오류
    SELFREG_E_CLASS = &H201&        ' 클래스 등록 오류
End Enum

Private m_VtblOffset As Long
Private m_CodeData() As Byte

Public Property Let Vtbl(ByVal Index As Long, ByVal lNewPtr As Long)
memcpy ByVal m_VtblOffset + Index * 4, lNewPtr, 4
End Property

Public Property Get Vtbl(ByVal Index As Long) As Long
memcpy Vtbl, ByVal m_VtblOffset + Index * 4, 4
End Property

Private Sub InitCodeData()
Const CODE_DATA = "5589E58B550CFFD28B5510890231C0" & _
                  "89EC5DC20C00"
Dim i As Long, k As Long

k = Len(CODE_DATA) \ 2
ReDim m_CodeData(0 To k - 1)
For i = 0 To k - 1
    m_CodeData(i) = CByte("&H" & Mid$(CODE_DATA, i * 2 + 1, 2))
Next

' 새 네이티브 메서드를 채워넣습니다.
k = VarPtr(m_CodeData(0))
Vtbl(2) = k + 0
End Sub

Private Sub Class_Initialize()
memcpy m_VtblOffset, ByVal ObjPtr(Me), 4
m_VtblOffset = m_VtblOffset + &H1C&
InitCodeData
End Sub

Private Sub Class_Terminate()
m_VtblOffset = 0
Erase m_CodeData
End Sub

' $네이티브 메서드: MakeVoidCall
Public Function MakeVoidCall(ByVal lpfnProc As Long) As Long
End Function

Private Function CallDllFunction(ByVal szFile As String, ByVal szFuncName As String) As ResultCode
Dim hMod As Long
Dim pfnProc As Long

On Error GoTo EFileException
If Len(Dir(szFile)) = 0 Then
EFileException:
    CallDllFunction = ERROR_FILE_NOT_FOUND
    Exit Function
End If
On Error GoTo 0

hMod = LoadLibrary(szFile)
If hMod Then
    pfnProc = GetProcAddress(hMod, szFuncName)
    
    If pfnProc Then
        ' DLL 함수 호출
        CallDllFunction = MakeVoidCall(pfnProc)
    Else
        CallDllFunction = ERROR_FILE_CORRUPT
    End If
    
    FreeLibrary hMod
Else
    CallDllFunction = ERROR_FILE_INVALID
End If
End Function

Public Function RegisterServer(ByVal szFile As String) As ResultCode
RegisterServer = CallDllFunction(szFile, "DllRegisterServer")
End Function

Public Function UnregisterServer(ByVal szFile As String) As ResultCode
UnregisterServer = CallDllFunction(szFile, "DllUnregisterServer")
End Function

Posted by koinit
,

먼제 레지스트리를 다루기 위해서는 먼저 레지스트리가 무엇인지 간단하게 알아보고 예제를 들기로 합시다.

 

레지스트리는 Win32환경에서 환경설정 정보가 저장되는 데이터 베이스이다.
레지스트리는 윈도 3.1의 초기화 파일(INI파일)의 개념을 완전히 대체했을 뿐
아니라 INI파일이 가졌던 정바가 다수의 파일에 분산 된다든 단점을 보완해 하나의
데이터베이스로 모은 형태로 채택했기 때문에 INI파일보다 훨씬 더 나은 해결책을
제시한다.

레지스트리는 네트워킹을 아울러 지원하며 각 사용자가 개인만의 정보를 저장해
놓을 수 있기 때문에 현재 사용자를 위한 사용자 인터페이스를 사용자화할 수
있다.

예를 들면 응용 프로그램에서 계속 유지해야할 환경 변수값이나, 최근에 사용했던
파일명 등을 기억할때도 레지스트리를 사용할 수 있다.
그외에도 binery타입으로 어떠한 정보도 저장할수 있다.

레지스트리는 공통 뼈대부분과 공통 가지부분을 가지고 있다. 이것이 의미하는 것은
윈도95(또는 NT)를 위해 작성된 응용 프로그램은 특정 데이터의 형태는 특정한 위치
에 저장되어 있을 것이라는 가정을 하게 된다는 뜻이다. 다음은 윈도95의 루트키를
설명한 것이다.

레지스트리 목록              | 설명
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HKEY_LOCAL_MACHINE | 하드웨어 구성 상태, 네트워크 프로토콜과 소프트웨어 클래스
                                    | 의 정보와 시스템에 설치된 소프트웨어 정보를 저장
HKEY_CLASSES_LOOT  | 파일 연관상태, 문서 형태 및 셸 인터페이스를 저장한다.
                                    |
HKEY_USERS                 | 사용자 각각의 시스템 구성 상태와 데스크탑 설정을 저장한다
                                     |
HKEY_CURRENT_USER  | 현재 사용자에 대응하는 HKEY_USER의 연결이다. 특별한 설정
                                    | 을가지지 않는 사용자는 ".Default"설정값을 갖게 된다.
HKEY_DYN_DATA          | 시스템의 각 요소에 대한 하드웨어 데이터를 저장한다.
                                    | 그리고 시스템의 성능값을 저장한다.
HKEY_CURRENT_CONFIG| 이는 HKEY_LOCAL_MACHINE의 config 서브키중 선택된
                                     | 환경설정 디스플레이 서브키에 대한 연결이다.
                    

그럼 이제부터 레지스트리를 다루기위한 Win32 API함수를 알아보자.
RegClosekey      | 열려진 레지스트리 키르 닫는다.
RegCreateKeyEx   | 새로운 서브키를 생성한다.
RegDeleteKey     | 특정 키를 삭제한다.
RegDeleteValue   | 레지스트리 키로부터 하나의 값을 삭제한다.
RegEnumKeyEx     | 어떤 키가 지닌 서브키를 나열한다.
RegEnumValue     | 어떤 키가 지닌 값들을 나열한다.
RegFlushKey      | 레지스트리의 변경상태를 즉시 저장한다.
RegLoadKey       | 최상위 루트키로부터 하이브(hive)를 읽어 들인다.
RegOpenKeyEx     | 특정 레지스트리키를 연다
RegQueryInfoKey  | 특정 키에 대한 정보를 반환한다.
RegQueryValueEx  | 특정 키의 특정 값을 반환한다.
RegRestoreKey    | 하이브르 이전에 저장되었던 키로 읽어 들인다.
RegSaveKey       | 서브키의 값이나 서브키를 하이브 파이로 저장한다.
RegSetValueEx    | 특정 키의 값에 값을 할당한다.(새로운 데이터형으로도)
RegUnloadKey     | 레지스트리로부터 하이브를 삭제한다.



이제 실제로 레지스트리를 다루는 예제를 보자.
다음 예제는 레지스트리를 편하게 다루기 위해 미약한 본인이 만들어 놓고 쓰는
함수이다.
물론 레지스트리의 모든것을 설명하지는 않았다.(본인이 실력이 딸려서)
하여튼 많은 분들께 도움이 되길.......


비베에서 제공하는 레지스트리 함수가 있지만 특정 키에 대해서만 쓸수 있는
아주 제약이 많은 이유로 본인은 거의 쓰지 않는다.


  1. Private Sub cmdGetValue_Click()
    Dim strSubKey As String
    Dim nRet As LONG, Dim strValue As String

    Const HKEY_LOCAL_MACHINE = &H80000002
    strSubKey = "SOFTWARE\Microsoft\Windows\CurrentVersion"

    nRet = GetRegValue(HKEY_LOCAL_MACHINE, strSubKey, _
                "fonts.fon", strValue)
    Text1.Text = strValue
    End Sub
       
    Private Sub cmdSetValue_Click()
    Dim strSubKey As String
    Dim nRet As Long, strValue As String

    Const HKEY_LOCAL_MACHINE = &H80000002
    strSubKey = "SOFTWARE\Microsoft\Windows\CurrentVersion"

    strValue = "96"
    nRet = SaveRegValueString(HKEY_LOCAL_MACHINE, strSubKey, _
        "TEST", strValue)
    Text1.Text = Cstr(nRet)
    End Sub

    Private Sub cmdEnumValue_Click()
    Dim strSubKey As String
    Dim nRet As LONG
    Dim strVlaueName() As string, strValue() As string, intCount as Integer

    Const HKEY_LOCAL_MACHINE = &H80000002
    strSubKey = "SOFTWARE\Microsoft\Windows\CurrentVersion"


    nRet = GetEnumValue(HKEY_LOCAL_MACHINE, strSubKey, strVlaueName(), _
                strValue(), intCount)
    Dim i As Integer
    if intCount > 0 then
        For i = 0 To intCount - 1 Step 1
            Text1 = Text1 + Chr(13) + Chr(10) + strVlaueName(i) + " : " + _
                strValue(i)
        Next i
    End if
    End Sub

 

  1. "**************************************************************************************************
    "목적 : 레지스트리에서 값을 읽어오거나 값을 저장할때 사용자는 본프로젝트의
    "인터페이스만 앎으로서 쉽게 레지스트리를 쉽게 조작할수 있게 한다.
    "(주) 레지스트리 키를 오픈하는 함수는 RegOpenKeyEx 를 사용해서 존재하지
    "않은 키를 열때는 에러가 발생한다.
    "만약 키가 존재하지 않을때 생성하기를 원한다면 RegCreateKey 또는
    "RegCreateKeyEx 함수를 사용하면 된다.
    "**************************************************************************************************

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


    Private Const KEY_ALL_ACCESS = &H2003F
    Private Const HKEY_CLASSES_ROOT = &H80000000
    Private Const HKEY_CURRENT_CONFIG = &H80000005
    Private Const HKEY_CURRENT_USER = &H80000001
    Private Const HKEY_DYN_DATA = &H80000006
    Private Const HKEY_LOCAL_MACHINE = &H80000002
    Private Const HKEY_USERS = &H80000003
    "------------------------------------------------------------
    "레지스트리 함수의 반환 에러 넘버
    "------------------------------------------------------------
    Private Const ERROR_SUCCESS = 0
    Private Const ERROR_FILE_NOT_FOUND = 2
    Private Const ERROR_ACCESS_DENIED = 5
    Private Const ERROR_INVALID_HANDLE = 6
    Private Const ERROR_BAD_NETPATH = 53
    Private Const ERROR_BAD_PATHNAME = 161
    Private Const ERROR_LOCK_FAILED = 167
    Private Const ERROR_BADKEY = 1010
    Private Const ERROR_REGISTRY_CORRUPT = 1015
    Private Const ERROR_DLL_INIT_FAILED = 1114

    Private Const REG_CREATED_NEW_KEY = &H1
    Private Const REG_OPENED_EXISTING_KEY = &H2

    Private Const REG_OPTION_NON_VOLATILE = 0&

    Private Const REG_SZ = 1                         " nul terminated string
    Private Const REG_BINARY = 3                     " Binery data
    Private Const REG_DWORD = 4                      " Double Word Number

    Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" _
    (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
    ByVal samDesired As Long, ByRef phkResult As Long) As Long

    Private Declare Function RegSetValueEx 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

    Private Declare Function RegQueryValueEx Lib "advapi32.dll"
    Alias "RegQueryValueExA" _
    (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
    lpType As Long, lpData As Any, lpcbData As Long) As Long

    Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long

    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 RegCreateKey Lib "advapi32" Alias "RegCreateKeyA" _
    (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

    Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA"
    (ByVal _
    hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName
    _
    As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long)
    As Long

    Private Declare Function RegQueryInfoKey Lib "advapi32.dll"
    Alias "RegQueryInfoKeyA" _
    (ByVal hKey As Long, ByVal lpClass As String, lpcbClass As Long, lpReserved As _
    Long, lpcSubKeys As Long, lpcbMaxSubKeyLen As Long, lpcbMaxClassLen As Long, _
    lpcValues As Long, lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, _
    lpcbSecurityDescriptor As Long, lpftLastWriteTime As Long) As Long


    "**************************************************************************************************
    "목적 : 레지스트리에서 새로운 키를 생성하는 함수
    "Arguments :
    "   RootKeyName : in, 레지스트리 ROOT키 이름
    "   SubKeyName  : in, 서브키 이름
    "Returns : 함수가 성공적으로 수행되면 ERROR_SUCCESS(0)반환하고 그렇지 않으면 에
    러넘버를 반환한다.
    "**************************************************************************************************
    Public Function CreateRegKey(ByVal RootKeyName As Long, _
                                ByVal SubKeyName As String) As Long
       
        CreateRegKey = -1
        Dim lngRet As Long, lngHKey As Long
        lngRet = RegCreateKey(RootKeyName, SubKeyName, lngHKey)
        If (lngRet <> ERROR_SUCCESS) Then GoTo errHandle       " 에러 발생시
        CreateRegKey = ERROR_SUCCESS
        RegCloseKey lngHKey
        Exit Function
    errHandle:
        CreateRegKey = lngRet
        RegCloseKey lngHKey
    End Function


    "**************************************************************************************************
    "목적 : 레지스트리 특정키의 모든이름에서 값이름과 값을 가져오는 함수
    "Arguments :
    "   RootKeyName     : in, 레지스트리 ROOT키 이름
    "   SubKeyName      : in, 서브키 이름
    "   strEnvNames()   : out, 값 이름이 저장될 스트링 배열(Call by reference로 값
    을 넘겨 받는다.)
    "   strEnvValues()  : out, 값이 저장될 스트링 변수 배열(Call by reference로 값
    을 넘겨 받는다.)
    "   intCount        : out, 값 List 갯수
    "               *참고사항
    "                1. 읽어올 레지스트리 값의 길이는 1024가 넘지 않도록 한다.
    "                2. 읽어올 데이타 타입이 더블워드형이거나 이진형태이면 헥사값을
    스트링형으로
    "                   반환한다.
    "Returns : 함수가 성공적으로 수행되면 ERROR_SUCCESS(0)반환하고 그렇지 않으면 에
    러넘버를 반환한다.
    "          에러넘버가 -1 이면 특정키에 데이타가 없음
    "**************************************************************************************************
    Public Function GetEnumValue(ByVal RootKeyName As Long, _
                                ByVal SubKey As String, _
                                ByRef strEnvNames() As String, _
                                ByRef strEnvValues() As String, _
                                ByRef intCount As Integer) As Long
                               
    GetEnumValue = -1
    Dim i As Integer
    Dim lngRet As Long
    Dim lngHKey As Long
    Dim lngIndex As Long
    Dim lngValueCount As Long
    Dim lngNameLength As Long
    Dim lngNameLen As Long
    Dim lngKeyValType As Long
    Dim lngKeyValSize As Long
    Dim strValueName As String

    Dim strValue As String
    Dim strTemp As String

    Dim bytTmpVal() As Byte
    Dim bytTmp As Byte
    lngRet = RegOpenKeyEx(RootKeyName, SubKey, 0, KEY_ALL_ACCESS, lngHKey)
    If (lngRet <> ERROR_SUCCESS) Then GoTo errHandle       " 에러 발생시

    lngRet = RegQueryInfoKey(lngHKey, 0, 0, ByVal 0, 0, 0, 0, lngValueCount, _
                            lngNameLength, 0, 0, 0)
    If (lngRet <> ERROR_SUCCESS) Then GoTo errHandle       " 에러 발생시
    lngIndex = 0
    intCount = lngValueCount
    If lngValueCount > 0 Then
        ReDim strEnvNames(lngValueCount - 1)
        ReDim strEnvValues(lngValueCount - 1)
    Else

        Call RegCloseKey(lngHKey)
        GetEnumValue = -1       "no data
        Exit Function
    End If

    Do While lngIndex <= lngValueCount - 1
        lngNameLen = lngNameLength + 1
        strValueName = String(1024, 0)
       
        lngRet = RegEnumValue(lngHKey, lngIndex, strValueName, lngNameLen, _
                    ByVal 0, lngKeyValType, ByVal bytTmp, lngKeyValSize)
        If (lngRet <> ERROR_SUCCESS) Then GoTo errHandle       " 에러 발생시
       
        strValueName = Left(strValueName, lngNameLen)
       
        strValue = String(lngKeyValSize, 0)
        ReDim bytTmpVal(lngKeyValSize - 1)
       
        Select Case lngKeyValType
        Case REG_SZ                                      " 레지스트리의 값 타입이 스
    트링형이면
            lngRet = RegQueryValueEx(lngHKey, strValueName, 0, lngKeyValType, ByVal
    strValue, lngKeyValSize)
        Case REG_DWORD, REG_BINARY                       " 레지스트리의 값 타입이
    Double Word형이면
            lngRet = RegQueryValueEx(lngHKey, strValueName, 0, lngKeyValType,
    bytTmpVal(0), lngKeyValSize)
        End Select
        If (lngRet <> ERROR_SUCCESS) Then GoTo errHandle         " 에러 발생시
        "------------------------------------------------------------
        " 데이타 타입에 따라서 데이타 Conversion
        "------------------------------------------------------------
        Select Case lngKeyValType
        Case REG_SZ                                      " 레지스트리의 값 타입이 스트링형이면
            For i = lngKeyValSize To 1 Step -1
            If Asc(Mid(strValue, i, 1)) = 0 Then
                    strTemp = Left(strValue, i - 1)
                Else
                    Exit For
                End If
            Next
        Case REG_DWORD, REG_BINARY                       " 레지스트리의 값 타입이Double Word형이면
            For i = lngKeyValSize - 1 To 0 Step -1       " 또는 Bynary형이면
                If bytTmpVal(i) > 16 Then
                    strTemp = strTemp + Hex(bytTmpVal(i))
                Else
                    strTemp = strTemp + "0" + Hex(bytTmpVal(i))
                End If
           
            Next
        End Select
        strEnvNames(lngIndex) = strValueName
        strEnvValues(lngIndex) = strTemp
        lngIndex = lngIndex + 1
        Erase bytTmpVal
        strTemp = ""
    Loop
    GetEnumValue = ERROR_SUCCESS                           " Return Success
    RegCloseKey lngHKey
    Exit Function

    errHandle:
    GetEnumValue = lngRet
    RegCloseKey lngHKey
    End Function


    "**************************************************************************************************
    "목적 : 레지스트리 특정키의 특정 이름에서 값을 가져오는 함수
    "Arguments :
    "   RootKeyName : in, 레지스트리 ROOT키 이름
    "   SubKeyName  : in, 서브키 이름
    "   ValueName   : in, 값이름
    "   KeyValue    : out, 값이저장될 포인터 즉,스트링 변수(Call by reference로 값을 넘겨 받는다.)
    "               *참고사항
    "                1. 읽어올 레지스트리 값의 길이는 1024가 넘지 않도록 한다.
    "                2. 읽어올 데이타 타입이 더블워드형이거나 이진형태이면 헥사값을
    스트링형으로
    "Returns : 함수가 성공적으로 수행되면 ERROR_SUCCESS(0)반환하고 그렇지 않으면 에러넘버를 반환한다.
    "**************************************************************************************************
    Public Function GetRegValue(ByVal RootKeyName As Long, _
                                ByVal SubKeyName As String, _
                                ByVal ValueName As String, _
                                ByRef KeyValue As String) As Long
                               
        GetRegValue = -1
        Dim i As Long                                  " 루프 카운터
        Dim lngRet As Long                             " API함수 리턴값
        Dim lngHKey As Long                            " Open된 레지스트리 핸들값
        Dim lngKeyValType As Long                      " 읽어올 데이타 타입
        Dim bytTmpVal(1024) As Byte                    " 읽어온 값이저장될 임시장소
        Dim strTmp As String                           " 읽어온 값이저장될 임시장소
        Dim lngKeyValSize As Long                      " 읽어온 데이타의 크기
        strTmp = String(1024, 0)
       

       
       
        "------------------------------------------------------------
        "레지스트리 키값 오픈
        "------------------------------------------------------------
        lngRet = RegOpenKeyEx(RootKeyName, SubKeyName, 0, KEY_ALL_ACCESS, lngHKey)
        If (lngRet <> ERROR_SUCCESS) Then GoTo errHandle       " 에러 발생시
        lngKeyValSize = 1024                           " 읽어올 바이트 수
        "------------------------------------------------------------
        " 레지스트리 값을 읽어옴
        "------------------------------------------------------------
        lngRet = RegQueryValueEx(lngHKey, ValueName, 0, lngKeyValType, bytTmpVal(0), lngKeyValSize)
        Select Case lngKeyValType
        Case REG_SZ                                      " 레지스트리의 값 타입이 스
    트링형이면
            lngRet = RegQueryValueEx(lngHKey, ValueName, 0, lngKeyValType, ByVal strTmp, lngKeyValSize)
        Case REG_DWORD, REG_BINARY                       " 레지스트리의 값 타입이Double Word형이면
            lngRet = RegQueryValueEx(lngHKey, ValueName, 0, lngKeyValType, bytTmpVal(0), lngKeyValSize)
        End Select
        If (lngRet <> ERROR_SUCCESS) Then GoTo errHandle         " 에러 발생시
        If (bytTmpVal(lngKeyValSize - 1) = 0) Then  " Win95에서는 문자열끝에 NullTerminated String포함
    "        lngKeyValSize = lngKeyValSize - 1       " WinNT에서는 문자열끝어 NullTerminate String포함안함
                                                    " 즉 문자열끝에 Null있으면 버퍼의 크기를 1 줄임
        End If
        "------------------------------------------------------------
        " 데이타 타입에 따라서 데이타 Conversion
        "------------------------------------------------------------
        Select Case lngKeyValType
        Case REG_SZ                                      " 레지스트리의 값 타입이 스트링형이면
            For i = lngKeyValSize To 1 Step -1
            If Asc(Mid(strTmp, i, 1)) = 0 Then
                    KeyValue = Left(strTmp, i - 1)
                Else
                    Exit For
                End If
            Next
        Case REG_DWORD, REG_BINARY                       " 레지스트리의 값 타입이Double Word형이면
            For i = lngKeyValSize - 1 To 0 Step -1       " 또는 Bynary형이면
                If bytTmpVal(i) > 16 Then
                    KeyValue = KeyValue + Hex(bytTmpVal(i))
                Else
                    KeyValue = KeyValue + "0" + Hex(bytTmpVal(i))
                End If
           
            Next
        End Select
        GetRegValue = ERROR_SUCCESS                           " Return Success
        lngRet = RegCloseKey(lngHKey)                         " Close Registry Key
        Exit Function                                         " Exit
    errHandle:
        KeyValue = ""
        GetRegValue = lngRet
        RegCloseKey lngHKey
    End Function


    "**************************************************************************************************
    "목적 : 레지스트리의 특정키의 특정 이름의 String값을 저장하는 함수
    "Arguments :
    "   RootKeyName : in, 레지스트리 ROOT키 이름
    "   SubKeyName  : in, 서브키 이름
    "   ValueName   : in, 값이름
    "   KeyValue    : in, 저장할 값(String Type)
    "   *참고사항
    "   1. 저장할 데이타의 길이는 스트링타입은 1024byte가 넘지 않도록(권장사항) 한
    다.
    "Returns : 함수가 성공적으로 수행되면 ERROR_SUCCESS(0)반환하고 그렇지 않으면 에
    러넘버를 반환한다.
    "**************************************************************************************************
    Public Function SaveRegValueString(ByVal RootKeyName As Long, _
                                        ByVal SubKeyName As String, _
                                        ByVal ValueName As String, _
                                        ByVal KeyValue As String) As Long

        SaveRegValueString = -1
        Dim lngRet As Long                             " API함수 리턴값
        Dim lngHKey As Long                            " Open된 레지스트리 핸들값
        Dim lngLen As Long
       
       
    "    Dim lpdwDisposition As Long
    "    Dim lpSecurityAttributes As SECURITY_ATTRIBUTES
    "    lpSecurityAttributes.nLength = 12
    "    lpSecurityAttributes.bInheritHandle = True
    "
    "    lngRet = RegCreateKeyEx(RootKeyName, SubKeyName, 0, "",
    REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpSecurityAttributes, lngHKey,
    lpdwDisposition)
       
        "------------------------------------------------------------
        "레지스트리 키값 오픈
        "------------------------------------------------------------
        lngRet = RegOpenKeyEx(RootKeyName, SubKeyName, 0, KEY_ALL_ACCESS, lngHKey)
        If lngRet <> ERROR_SUCCESS Then GoTo errHandle         " 에러 발생시

        lngLen = Len(KeyValue)
        lngRet = RegSetValueEx(lngHKey, ValueName, 0, REG_SZ, ByVal KeyValue,
    lngLen)
       
        If lngRet <> ERROR_SUCCESS Then GoTo errHandle
        lngRet = RegCloseKey(lngHKey)
        SaveRegValueString = ERROR_SUCCESS
       
        Exit Function

    errHandle:
        SaveRegValueString = lngRet
        RegCloseKey (lngHKey)
    End Function


    "**************************************************************************************************
    "목적 : 레지스트리의 특정키의 특정 이름의 DWORD값을 저장하는 함수
    "Arguments :
    "   RootKeyName : in, 레지스트리 ROOT키 이름
    "   SubKeyName  : in, 서브키 이름
    "   ValueName   : in, 값이름
    "   KeyValue    : in, 저장할 값(Long Type)
    "   *참고사항
    "   1. 더블워드 값의 범위가 Long형의 범위를 넘지않도록한다.
    "Returns : 함수가 성공적으로 수행되면 ERROR_SUCCESS(0)반환하고 그렇지 않으면 에러넘버를 반환한다.
    "**************************************************************************************************
    Public Function SaveRegValueDword(ByVal RootKeyName As Long, _
                                        ByVal SubKeyName As String, _
                                        ByVal ValueName As String, _
                                        ByVal KeyValue As Long) As Long
                                       
        Dim lngRet As Long                             " API함수 리턴값
        Dim lngHKey As Long                            " Open된 레지스트리 핸들값
        Dim lngLen As Long
        SaveRegValueDword = -1
       
    "    Dim lpdwDisposition As Long
    "    Dim lpSecurityAttributes As SECURITY_ATTRIBUTES
    "    lpSecurityAttributes.nLength = 12
    "    lpSecurityAttributes.bInheritHandle = True
       
    "    lngRet = RegCreateKeyEx(RootKeyName, SubKeyName, 0, "",
    REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpSecurityAttributes, lngHKey,
    lpdwDisposition)
       
        "------------------------------------------------------------
        "레지스트리 키값 오픈
        "------------------------------------------------------------
        lngRet = RegOpenKeyEx(RootKeyName, SubKeyName, 0, KEY_ALL_ACCESS, lngHKey)
        If lngRet <> ERROR_SUCCESS Then GoTo errHandle         " 에러 발생시
       

        lngTmp = CLng(KeyValue)
        lngRet = RegSetValueEx(lngHKey, ValueName, 0, REG_DWORD, KeyValue, Len(lngTmp))
      
        If lngRet <> ERROR_SUCCESS Then GoTo errHandle
        lngRet = RegCloseKey(lngHKey)
        SaveRegValueDword = ERROR_SUCCESS
       
        Exit Function

    errHandle:
        SaveRegValueDword = lngRet
        RegCloseKey (lngHKey)
    End Function


    "**************************************************************************************************
    "목적 : 레지스트리의 특정키의 특정 이름의 Binary값을 저장하는 함수
    "Arguments :
    "   RootKeyName : in, 레지스트리 ROOT키 이름
    "   SubKeyName  : in, 서브키 이름
    "   ValueName   : in, 값이름
    "   KeyValue    : in, 저장할 값(Byte Type Array)
    "   *참고사항
    "Returns : 함수가 성공적으로 수행되면 ERROR_SUCCESS(0)반환하고 그렇지 않으면 에러넘버를 반환한다.
    "**************************************************************************************************
    Public Function SaveRegValueBinary(ByVal RootKeyName As Long, _
                                ByVal SubKeyName As String, _
                                ByVal ValueName As String, _
                                ByRef KeyValue() As Byte) As Long

        SaveRegValueBinary = -1
        Dim lngRet As Long                             " API함수 리턴값
        Dim lngHKey As Long                            " Open된 레지스트리 핸들값
        Dim lngLen As Long
       
        "------------------------------------------------------------
        "레지스트리 키값 오픈
        "------------------------------------------------------------
        lngRet = RegOpenKeyEx(RootKeyName, SubKeyName, 0, KEY_ALL_ACCESS, lngHKey)
        If lngRet <> ERROR_SUCCESS Then GoTo errHandle         " 에러 발생시
       
        Dim lngTmp As Long
        lngTmp = UBound(KeyValue) + 1
        lngRet = RegSetValueEx(lngHKey, ValueName, 0, REG_BINARY, KeyValue(0),lngTmp)
       
        If lngRet <> ERROR_SUCCESS Then GoTo errHandle
        lngRet = RegCloseKey(lngHKey)
        SaveRegValueBinary = ERROR_SUCCESS
       
        Exit Function

    errHandle:
        SaveRegValueBinary = lngRet
        RegCloseKey (lngHKey)
    End Function

Posted by koinit
,

요약
Windows 2000 환경에서 각 클라이언트나 서버의 레지스트리 항목을 추가構킬?삭제하려면 VBScript를 작성하여 로그온 스크립트로 실행할 수 있습니다. WScript.Shell 개체의 RegWrite() 메소드와 RegDelete() 메소드를 이용합니다.
현상
메모장과 같은 일반적인 텍스트 파일 편집기를 이용하여 Visual Basic Script를 작성함으로써, 레지스트리에 항목을 추가하거나 변경 또는 삭제할 수 있습니다. 텍스트 형태로 입력한 후, 확장자를 .vbs로 저장합니다. WScript.Shell 개체를 만들고, 새로운 항목을 만들거나 기존 항목을 변경하려면 RegWrite() 메소드를, 기존 항목을 삭제하려면 RegDelete() 메소드를 사용합니다. • 값(value)은 문자열의 마지막이 '\' 없이 끝나고, 키(key)는 마지막에 '\'를 포함합니다.
• 레지스트리 하이브(Registry hive)의 루트에는 다음과 같은 약자를 사용할 수 있습니다.

루트 키(Root key) 약자
HKEY_CURRENT_USER HKCU
HKEY_LOCAL_MACHINE HKLM
HKEY_CLASSES_ROOT HKCR
HKEY_USERS HKEY_USERS
HKEY_CURRENT_CONFIG HKEY_CURRENT_CONFIG

• RegWrite() 메소드의 3번째 인수에는 값의 형식을 지정합니다. 이 때 다음 표와 같이 인수를 지정합니다. 형식 인수
문자열 REG_SZ
문자열(%comspec% 등과 같은 환경 변수를 포함하는 경우) REG_EXPAND_SZ
정수 REG_DWORD
이진 문자열 REG_BINARY


[예제] less..

다음 예제는 HKEY_CURRENT_USER에 있는 "Software\MyCompany\MyApp\MyValue" 값을 삭제합니다.

Option Explicit
Const strValuePath = "HKCU\Software\MyCompany\MyApp\MyValue"

Dim wshShell
Set wshShell = WScript.CreateObject("WScript.Shell")

On Error Resume Next
wshShell.RegDelete strValuePath


다음 예제는 HKEY_CURRENT_USER에 "Software\MyCompany\MyApp\MyValue" 값을 문자열(string) 형태로 추가합니다. 이미 이 값이 존재할 경우, 새로운 값으로 변경됩니다.

Option Explicit
Const strValuePath = "HKCU\Software\MyCompany\MyApp\MyValue"

Dim wshShell
Set wshShell = WScript.CreateObject("WScript.Shell")

On Error Resume Next
wshShell.RegWrite strValuePath, "Hello", "REG_SZ"

[예제] less..



위를 적용시킨 vbs파일 less..


filename: regdel_script.vbs

Option Explicit

On Error Resume Next

Const strValuePath = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ADSpider"

Dim wshShell
Set wshShell = WScript.CreateObject("WScript.Shell")

On Error Resume Next
wshShell.RegDelete strValuePath

위를 적용시킨 vbs파일 less..



원인
이벤트 8001이 오류로 기록되는 경우는 다음과 같습니다. • 백업하려는 파일에 대한 액세스 실패 (access denied)
• 파일 손상 (file corruption)
• 디스크 블럭 손상 (bad disk block)
이와 같은 원인 중 한 가지라도 발생하면 이벤트 8001이 오류 형식으로 기록됩니다.

추가 정보
RegWrite 메소드와 RegDelete 메소드에 대한 자세한 내용은 다음 문서를 참고하십시오.
http://msdn.microsoft.com/library/en-us/wsh/htm/wsMthRegWrite.asp
http://msdn.microsoft.com/library/en-us/wsh/htm/wsMthRegDelete.asp
WSH에 대한 내용은 다음 문서를 참고하십시오.
Q177699 Overview of Windows Script Host in Windows 2000
Windows Script Host에 대한 설명은 다음 웹 사이트를 참고하십시오.
Microsoft Scripting Technologies
http://msdn.microsoft.com/scripting/
Posted by koinit
,