https://submit.naver.com/ 으로 가시면 검색 등록을 하실수 있읍니다.
검색 등록을 하시려면 우선은 네이버에 계정이 하나 있으셔야 등록이 가능합니다.

네이버 등록 페이지 상단의 위 이미지 같은 신규 등록 페이지를 누르시면 신규 등록 페이지로 가실수 있으며
https://submit.naver.com/regist.nhn 링크를 클릭하셔도 가실수 있읍니다.

신규 등록 페이지에서 3번째의 네이버 검색 결과에서 내 홈페이지를 노출하소 싶으세요를 클릭합니다.
클릭후 현재 네이버 계정에 로그인 상태라면 등록 정보 입력 페이지로 바로 이동할 것이고,
로그인 하지 않은 상태라면 로그인 페이지로 이동되며 로그인 후 입력 페이지로 가계 됩니다.

네이버에 검색 신청시에
해당 블로그에 P2P나 웹하드 등에 대한 계시글이 있다면 등록이 취소되니다.
이때는 해당 게시물을 삭제나, 비공개 처리 후에 재심사 요청을 하시면 됩니다.
리터럴(liternal) 형식 문자는 상수에 지정하며 이 상수는 어떤 자료형이다를 지정한다.
VB.NET에서는 정수는 Integer 형식으로 표현 가능한 수치 이면 Interger로 그 이상이면 Long형으로 취급된다. 그런데 상수가 너무 커서 Long형 자료형에는 포함 할수 없고, Decimal 자료형에 포함할수 있는 상수인 경우 리터널 형식 문자를 지정하지 않으면 Decimal 자료형에 지정할수 없고 오버플로가 발생한다. 따라서 이런 상수를 지정을 할려면 리터널 형식 문자를 지정하여야 한다

또한 실수 같은 경우는 무조건 Double로 취급이된다. 그런데 상수가 너무 커서 Double형 자료형에는 포함 할 수 없고, Decimal 자료형에 포함할수 있는 상수인경우, 리터널 형식 문자를 지정하지 않으면, 아무리 수를 크게 써도 Double 자료형에 저장될수 있도록 툴이 소숫점 이하의 수치를 제한을 한다, 따라서 이런 상수를 지정을 할려면 리터널 형식 문자를 지정하여야 한다

리터널 형식 문자는 다음과 같다.
 S  Shor
 I  Integer
 L  Long
 D  Decimal
 F  Single
 R  Double
 C  Char

리터널 형식 문자가 Singe와 Double만 자료형의 선두 문자를 쓰지 않고, 나머지 자료형은 자료형의 선두 문자를 사용한다.
SetWindowPos는 윈도우를 크기,위치,Z-위치(3차원 위치)를 지정할 수 있다.

윈도우의 Z위치, 2차원적인 위치, 크기를 설정한다.
● 선언
Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

인수
hwnd ━ 위치 변경시킬 윈도우 핸들
hWndInsertAfterIMG SRC="_image\_Option.gif"> ━ Z 순서, 즉 윈도우의 앞뒤 상태를 지정한다. 윈도우 핸들을 지정해면, Z위치가 지정된 윈도우 핸들의 윈도우 뒤에 위치하게 된다.
x ━ 윈도우 왼쪽 상단 x축 위치
y ━ 윈도우 왼쪽 상단 y축 위치
cx ━ 윈도우의 폭
cy ━ 윈도우의 높이
wFlags ━ 크기나 위치를 어떤식으로 변경할지 나타내는 플래그

반환
성공 ━ 0이 아닌 값
실패 ━ 0

상수
hWndInsertAfter 사용, Z 순서(윈도우 앞뒤 순서)를 나타낸다.
상수 설명
HWND_BOTTOM 1 최하위
HWND_TOP 0 상위
HWND_NOTOPMOST -2 최상위가 아님
HWND_TOPMOST -1 최상위

wFlags 사용, 크기나 위치지 변경 플래그, or로 연결 가능

상수 설명
SWP_DRAWFRAME SWP_FRAMECHANGED
SWP_FRAMECHANGED &H20 새로운 윈도우(프레임) 스타일 적용을 알리도록 한다. WM_NCCALCSIZE 메시지를 강제적으로 보낸다
SWP_HIDEWINDOW &H80 윈도우를 보이지 않게 한다
SWP_NOACTIVATE &H10 윈도우를 활성화 시키지 않는다
SWP_NOCOPYBITS &H100 클라이언트 영역의 모든 요소를 무시
SWP_NOMOVE &H2 위치를 변경시키지 않는다.
SWP_NOOWNERZORDER &H200 윈도우의 Z위치를 변경하지 않는다
SWP_NOREDRAW &H8 윈도우를 새로 그리지 않는다
SWP_NOREPOSITION SWP_NOOWNERZORDER
SWP_NOSENDCHANGING &H400 WM_WINDOWPOSCHANGING 메시지를 받지 않도록 한다
SWP_NOSIZE &H1 크기를 변경시키지 않는다
SWP_NOZORDER &H4 Z 순서를 유지한다.
SWP_SHOWWINDOW &H40 윈도우를 보이게 한다

다음은 소스의 이미지이다.

상위의 옵션 버튼이 선택된 상태에서 마우스 왼쪽 버튼을 누르게 되면 현재 마우가 위치한 윈도우는 항상 최상위 윈도우가 된다
하위 옵션 버튼이 선택된 상태에서 마우스 왼쪽 버튼을 누르게 되면 현재 마우스가 위치한 윈도우는 Z-위치기 변화되는 일반 윈도우가 된다

다음은 소스이다.
' 폼 소스
' 최상위 윈도우
Option Explicit ' 모든 변수는 선언된 뒤에 사용할 수 있다.

Private Declare Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long ' 훅체인에 훅프로시저를 선두에 끼워넣는다, 성공하면 훅프로시저의 핸들을 복귀한다.
Private Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long) As Long ' 훅체인에서 훅 핸들이 나타내는 훅 프로시저를 제거한다.
Private Const WH_MOUSE_LL = 14

Private hhkLowLevelMouse As Long  ' 훅 설치가 완료되는경우, 그 훅을 나타내는 핸들

Private Sub Form_Load()
    TopWindow = 0
    optTopWindow(TopWindow).Value = True
    hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, App.hInstance, 0)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If hhkLowLevelMouse = 0 Then Exit Sub
    UnhookWindowsHookEx hhkLowLevelMouse ' 훅을 체인에서 훅 제거한다.
    hhkLowLevelMouse = 0
End Sub

Private Sub optTopWindow_Click(Index As Integer)
    TopWindow = Index
End Sub

' 모듈 소스
Option Explicit ' 모든 변수는 선언된 뒤에 사용할 수 있다.

Public TopWindow As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) ' 메모리 내용을 복사한다.
Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long ' 훅체인에서 다음 훅프로시저를 호출한다.
Private Declare Function WindowFromPoint Lib "USER32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SetWindowPos Lib "USER32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetParent Lib "USER32" (ByVal hWnd As Long) As Long
Private Const HC_ACTION = 0
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const WM_LBUTTONDOWN = &H201

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Type MSLLHOOKSTRUCT
    pt          As POINTAPI
    mouseData   As Long
    flags       As Long
    time        As Long
    dwExtraInfo As Long
End Type

Private p As MSLLHOOKSTRUCT

Public Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim Windowhwnd As Long ' 마우스 위치의 윈도우 핸들
    Dim CheckParenthwnd As Long ' 부모 윈도우를 찾기 위함
    Dim MousePoint As POINTAPI ' 마우스의 위치
   
    If (nCode = HC_ACTION) And wParam = WM_LBUTTONDOWN Then
        CopyMemory p, ByVal lParam, Len(p)
        Windowhwnd = WindowFromPoint(p.pt.X, p.pt.Y)
        CheckParenthwnd = Windowhwnd
        While Not CheckParenthwnd = 0
            Windowhwnd = CheckParenthwnd
            CheckParenthwnd = GetParent(Windowhwnd)
        Wend
        SetWindowPos Windowhwnd, IIf(TopWindow = 0, HWND_TOPMOST, HWND_NOTOPMOST), 0&, 0&, 0&, 0&, SWP_NOMOVE Or SWP_NOSIZE
    End If
    LowLevelMouseProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End Function

찜질기 중에 물이 들어가 있는 찜질기 중에 표면에 물 주입구가 달려 있는 것들이 있다.
이것들은 몸체 전반적으로 너무 센 압력을 주개 되면 물 주입구의 마개가 빠지개 되므로 주의해야 한다.
만약 마개가 빠져서 물이 세었다면, 주사기나, 빨대로 물을 주입하면 된다,
물을 넣을때 서서히 너야지 너무 빨리 넣으면 주입구로 물이 잘 들어가지 않는다.
(노가다 성격이 있지만, 빨대를 사용하면 편하다)

또한 찜길기가 잘 대워지지 않을때는 찜질기 내에 물에 부유물이 많다거나, 공기가 많이 들어갔거나 그렇다, 이럴때는 물 주입구의 고무마개를 빼서 물을 갈아주거나, 공기를 빼주면 된다.

주입구의 고무마개를 열때는 주입구를 양쪽으로 누르면 주입구와 고무마개의 틈이 벌어지는대 이사이를 손톱이나, 사이에 들어갈수 있는 기구를 사용하여 고무 마개를 빼면 된다, 이때 너무 날카로운것으로 하면
마개와 주입구가 손상될수 있으므로 너무 날카로운 것은 피하는 것이 좋다.

내가 가지고 있는 찜질기의 물 주입구이다.

 

훅에도 여러 종류가 있지만
전역  훅을 사에도
어떤 타입의 훅으 사용하느냐에 따라 훅 타입이 있으며
이들 훅은 각 타입에 따라 훅체인을 이룬다
훅체인은 각 훅 프로시저(훅으 처리하는 프로시저)를 고리처럼 묶어둔 것을 말한다. 훅 배열이라고 할가.

이 훅체인에 훅 프로시저를 추가하기 위해서는 용하기 SetWindowsHookEx를 사용하며
훅체인에서 훅 프로시저를 제거하기 위해선는 UnhookWindowsHookEx를 사용한다.

훅 타입에는 다음과 같은 타입이 있다.

WH_CALLWNDPROC 4 윈도우 프로시저 후킹
WH_CALLWNDPROCRET 12
WH_CBT 5
WH_DEBUG 9
WH_FOREGROUNDIDLE 11
WH_GETMESSAGE 3 GetMsgProc 메세지 큐에 메세지를 감시한다
WH_JOURNALPLAYBACK 1
WH_JOURNALRECORD 0
WH_KEYBOARD 2
WH_KEYBOARD_LL 13 LowLevelKeyboardProc 저수준 키보드 훅을 한다
WH_MOUSE 7 마우스 메세지
WH_MOUSE_LL 14 LowLevelMouseProc 마우스 저수준 훅을 한다
WH_MSGFILTER -1
WH_SHELL 10
WH_SYSMSGFILTER 6

훅체인에 훅 프로시저를 추가하여 메세지를 후킹한다
● 선언 Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long

● 인수

idHook ━ 후킹할 메세지 타입
lpfn ━ 후킹 메세지가 전달될 프로시저 주소(AddressOf testHook) 하면 함수의(일반 모듈에 선언된) 주소를 얻을수 있다. 훅에 사용할 함수 형식은 함수명(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long, 각 인수의 값을 훅타입에 따라 의미가 다르다
hmod ━ 인스턴스 핸들로, lpfn에 전달된 프로시저를 포함한는 DLL의 인스턴스 핸들, 만약 DLL에 프로시적아 있다면 DLL의 인스턴스 핸들을 넘겨주면 되고, 그렇치 않다면 응용프로그램의 핸들(App.Instarance)을 넘겨주면 된다
dwThreadId ━ 쓰레드 식별자, 0이면 호출된 쓰레드를 나타낸다.

반환
성공 ━ 설치된 훅 핸들값
실패 ━ 0

다음은 마우스를 훅한 예이다



다음은 소스이다
' 폼 소스
' 저수준 마우스 전역 훅
Option Explicit ' 모든 변수는 선언된 뒤에 사용할 수 있다.

Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long ' 훅체인에 훅프로시저를 선두에 끼워넣는다, 성공하면 훅프로시저의 핸들을 복귀한다.
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long ' 훅체인에서 훅 핸들이 나타내는 훅 프로시저를 제거한다.
Private Const WH_MOUSE_LL = 14

Private hhkLowLevelMouse As Long  ' 훅 설치가 완료되는경우, 그 훅을 나타내는 핸들

Private Sub Form_Load()
    Set WindowMessage = Label1
    hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, App.hInstance, 0)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If hhkLowLevelMouse = 0 Then Exit Sub
    UnhookWindowsHookEx hhkLowLevelMouse ' 훅을 체인에서 훅 제거한다.
    hhkLowLevelMouse = 0
End Sub

'모듈 소스
Option Explicit ' 모든 변수는 선언된 뒤에 사용할 수 있다.

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) ' 메모리 내용을 복사한다.
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long ' 훅체인에서 다음 훅프로시저를 호출한다.

Private Const HC_ACTION = 0 ' 메세지의 일반적인 상태

Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_MOUSEMOVE = &H200
Private Const WM_MOUSEWHEEL = &H20A
Public Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205

Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type MSLLHOOKSTRUCT
    pt          As POINTAPI
    mouseData   As Long
    flags       As Long
    time        As Long
    dwExtraInfo As Long
End Type

Public WindowMessage As Label

Dim p As MSLLHOOKSTRUCT

' 키보드 훅 프로시저
Public Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If (nCode = HC_ACTION) Then
        Select Case wParam
            Case WM_MOUSEMOVE
                WindowMessage.Caption = "마우스가 움직였읍니다"
            Case WM_LBUTTONDOWN
                WindowMessage.Caption = "마우스가 왼쪽 버튼이 눌렸읍니다."
            Case WM_LBUTTONUP
                WindowMessage.Caption = "마우스가 왼쪽 버튼이 눌렸다 놓였읍니다."
            Case WM_RBUTTONDOWN
                WindowMessage.Caption = "마우스가 오른쪽 버튼이 눌렸읍니다."
            Case WM_RBUTTONUP
                WindowMessage.Caption = "마우스가 오른쪽 버튼이 눌렸다 놓였읍니다."
            Case WM_MOUSEWHEEL
                WindowMessage.Caption = "마우스가 휠이 움직였읍니다."
            Case WM_MBUTTONDOWN
                WindowMessage.Caption = "마우스가 가운데 버튼이 눌렸읍니다."
            Case WM_MBUTTONUP
                WindowMessage.Caption = "마우스가 가운데 버튼이 눌렸다 놓였읍니다."
            Case Else
                Debug.Print Hex(wParam)
        End Select
    End If
    CopyMemory p, ByVal lParam, Len(p)
    WindowMessage.Caption = WindowMessage.Caption & " " & p.pt.x & " " & p.pt.y
    LowLevelMouseProc = CallNextHookEx(0, nCode, wParam, ByVal lParam) ' 훅체인에 다음 훅 프로시저를 호출한다.
End Function


CallNextHookEx는 훅체인에서 다음 훅 프로시저를 호출하게 된다

엑세스에서 Jet 엔진을 통한 SQL을 사용하는 경우
엑세스 2003과 엑세스 2007에는 Replace 매크로 함수가 정의도어 있지 않다

'SQL' 카테고리의 다른 글

select into와 insert into select의 차이  (0) 2012.08.16
Like 연산자의 패턴에 쿼리 사용하기  (0) 2011.09.20
한국 리서치 사이트는 다른 사이트와 다르게
아무나 가입할수 없읍니다. 단지 이 사이트에서 메일을 받으신분만 가입할수 있읍니다.
조사한 내용에 대한 지급은 가입시 기입한 통장으로 조사후 3~4주 후에 입금됩니다.

여론 조사 사이트인 패널 인사이드를 소개합니다.
여기도 다른 여론 조사 마찬가지로, 조사마다 적립금이 지급니되고,일정 금액 이상이면 적립금이 지급 신청을 하실수 있읍니다.

가입하시고 하시면 됩니다.

적립금이 오천원 이상이 되면 현금 및 기타 원하시는 방법으로 지급 신청을 하실수 있읍니다.

다음 표에서는 Visual Basic에서 사용할 수 있는 묶기 문자와 형식 문자를 보여 줍니다.

데이터 형식

묶기 문자

추가된 형식 문자

Boolean

(없음)

(없음)

Byte

(없음)

(없음)

Char

이때

C (중요)

Date

#

(없음)

Decimal

(없음)

D 또는 @

Double

(없음)

R 또는 #

Integer

(없음)

I 또는 %

Long

(없음)

L 또는 &

Short

(없음)

S

Single

(없음)

F 또는 !

String

이때

(없음)

CTS는 닷넷 프레임 워크에서 사용되는 모든 언어들이 지원할 수 있는 자료형들을 말한다.
vb.net이나 c#, j# 등의 언어에서 사용할 수 있는 자료형들의 규칙이라고 할가.
각 언어에서는 이 자료형을 직접 쓰기 보다는 이 자료형을 대신해서 사용할수 있는 단어로 지정해 놓고 있다.

다음은 CTS에서 타입 종류이다.



http://wvbiz.tistory.com/1

픽처박스와 프로그래스 바를 하나 생성하고, 픽처박스에 프로그래스바를 넣고, 픽처박스에 프로그래바를 포함한 내용을 다시 그리다음, 픽처박스의 image를 이미지리스트에 추가하고 이것을 리스트뷰와 연결해 주면 된다.

다음은 초기 이미지이다.


진행 프로그래스바 표시 버튼을 눌르면 리스트뷰에 진행율 프로그래스바가 표시된다.
프로그래스바와, 픽처박스는 감춰줘있다.


다음은 소스이다.

' 리스트 뷰에 프로그래스 표시
Option Explicit

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' 메세지를 보낸다.

Private Const WM_PAINT = &HF
Private Const WM_PRINT = &H317
Private Const PRF_CHILDREN = &H10&
Private Const PRF_CLIENT = &H4&

Private Sub Command1_Click()
    Dim NewItem As ListItem

    ListView1.ListItems.Clear
    ImageList1.ListImages.Clear
    Set NewItem = ListView1.ListItems.Add(, vbNullString)
    NewItem.SubItems(1) = "테스트"
    NewItem.SubItems(2) = vbNullString
    ImageList1.ListImages.Add , , Picture1.Image
    NewItem.ListSubItems(2).ReportIcon = ImageList1.ListImages.Count
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    With ListView1
        .ColumnHeaders.Add 1, , vbNullString, 0, 0
        .ColumnHeaders.Add 2, , "테스트", 120, 0
        .ColumnHeaders.Add 3, , "진행률", 250, 0
    End With
    With Picture1
        Picture1.Line (.ScaleTop, .ScaleLeft)-(.ScaleWidth - 1, .ScaleHeight - 1), vbBlack, B
        ProgressBar1.Move .ScaleTop, .ScaleLeft, .ScaleWidth, .Height
        ProgressBar1.Max = .ScaleWidth
    End With
End Sub

Private Sub Timer1_Timer()
    Static CountNumber As Long
   
    ProgressBar1.Value = (ProgressBar1.Max - ProgressBar1.Min) * (CountNumber * 0.01)
    SendMessage Picture1.hwnd, WM_PAINT, Picture1.hDC, 0 ' 소스 픽처박스의 클라이언트 영역을 픽처박스에 그린다, 이미지는 윈도우가 아니라 클라이언트 영역의 일부를 사용하므로, 이미지 컨트롤의 이미지가 그려진다. 화면과,Image 속성에도 그려진다.
    SendMessage Picture1.hwnd, WM_PRINT, Picture1.hDC, PRF_CHILDREN Or PRF_CLIENT ' 이번에 픽처박스 클라이언트 위의 컨트롤들을 메모리(Image 속성)에 그린다.
    With Picture1
        Picture1.Line (.ScaleTop, .ScaleLeft)-(.ScaleWidth - 1, .ScaleHeight - 1), vbBlack, B
    End With
    ImageList1.ListImages.Add , , Picture1.Image
    ListView1.ListItems(1).ListSubItems(2).ReportIcon = ImageList1.ListImages.Count
    ListView1.ListItems(1).ListSubItems(2).Text = CountNumber & " %"
    If CountNumber >= 100 Then
        Timer1.Enabled = False
    Else
        CountNumber = CountNumber + 5
        If CountNumber > 100 Then CountNumber = 100
    End If
End Sub

무료로 동영상 변환할 수 있는 툴입니다.
툴은 http://www.umileencoder.com/kr/download/download.html 다운로드 받으실수 있읍니다.


초기 이미로 파일 추가 버튼을 누르면 변환할 동영상 파일을 추가할 수 있읍니다.
다음 이미지는 추가한 동영상 파일입니다.

옵션 설정 버튼을 누르면 다음과 같은 창이 뜹니다.


여기서 프리셋을 눌러서 변환할 파일이 사용될 기기에 따라서 파일 종류를 지정할 수 없읍니다.
원하는 기기가 없다면 일반을 선택하셔서 파일 종류를 선택하시면 됩니다.

파일 종류를 선택하셨다면, 아래 코덱,크기 등등을 선택하시고 확인을 누르시면 동영상을 어떡게 변활지의 설정은 끝났읍니다.
변환시작 버튼을 누르면 변환이 시작됩니다.

다른 동영상 툴이 여럿 있지만, 무료라면서 도중에 중단되어, 용량 제한이 있다더지,너무 복잡하다던지 그런 문제점이 많았읍니다.

이 툴에는 그런 제한은 없읍니다. 단지 이 툴이 실행될때 창 오른쪽에 항상 광고가 뜹니다.

'기타 > 무료' 카테고리의 다른 글

PC에서 인터넷으로 팩스를 무료로 보내자.  (0) 2011.09.15

툴 이름은 Virtual Serial Port Emulator이다.

시리얼 포트를 에물레이터 해주는 툴이다.
가상의 시리얼 포트를 만들거나, 두 포트를 연결해주는 시리얼 포트를 만든다.
시리얼 포트 프로그램을 작성시에 사용하면 유용할 듯 한다.

다음은 두개의 시리얼 포트를 연결한 가상의 시리얼 포트를 생성한 이미지이다.


가상의 2개의 시리얼 포트 생성하고 두 포트를 연결한 것이다.
즉 한쪽의 가상의 시리얼 포트에 입력은 다른 가상의 사리얼 포트의 출력으로 나오게 된다.


http://www.eterlogic.com/Downloads.html 가면 다운로드 받을수 있다.

ODBC설정중 시스템 DSN은 레지스트리를 설정하므로서 ODBC 시스템 DSN을 설정할 수 있다.

레지스트리의 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI 키값에 설정하면 된다.

ODBC\ODBC.INI 키 아래 ODBC Data Sources에서 문자 값을 새성할 시스템 DSN의 이름을 설정하면 된다.
ODBC\ODBC.INI 키 아래 시스템 DSN과 같은 이름의 키를 생성하고 그 안에 여러 값들을  설정들 하면된다.

실제로 ODBC 관리자(시작-제어판-관리 도구-데이터 원본 (ODBC))로 시스템 DSN을 생성해 보고, 위 키값을 참조하면 설저 값에 어떤 값을 설정할지 알수 있다. vb6에서 레지스트 함수로는 설정할 수 없으므로, API를 사용하면 설정 가능하다.
replace(format(출력할 수치나 문자,"자릿수 만큼 @")," ",공백 대신 채울 문자)

replace(format(hex(15),"@@")," ",0)
결과는 0f
  • VB6에서 문자는 내부적으로는 유니코드로 처리된다.
    유니코드로 저장될때는 영문이던, 한글이던 어떤 문자가 저장될 때는 2바이트가 필요하다.
    유니코드가 메모리에 저장될때에는 바이트 순서가 바뀌어서 저장된다.(8086 계열)
    "가"라는 문자가 저장된다고 할때. "가"에 문자의 유니코드는 &HAC00이다. 이것이 메모리에 저장될때는
    첫번째 바이트에 &h00이 두번째 바이트에는 &hAC가 저장된다.

    기본 내장함수 asc와 ascb와 ascw의 차이점을 보면
    -asc에서 인수에 전달한 값은 유니코드로 간주하며 주어진 인수의 2바이트를 ANSI 문자로 바꾸어 그 코드를 반환한다.
    즉, asc("가")를 하게 되면 "가"에 대한 유니코드 값이 반환 되는 것이 아니라 "가"에 대한 ANSI 코드가 반환단다.
  • ascb는 주어진 인수가 유니코드인지 ANSI 코드 인지 관계없이 메모리에 저장된 첫번째 바이트 값을 반환한다.
    즉 ascb("가")를 하개 되면 &h00이 반환된다.
  • ascw는 주어진 인수가 유니코드라고 간주하고 인수의 2바이트 값을 얻은후에 서로 위치를 바꾼후의 값을 반환한다.
    ascw("가")를 하게 되면 &HAC00이 반환된다.
  • 한가지 더, midb도 마찬가지로 현재 메모리에 저장된 순으로 값을 가져온다.

 

 

 

 

 

 

먼저 비교할 이미지의 크기는 같다는 조건이며, 하나의 픽셀도 다르다면 다른것으로 간주한다.

GetDIBits는 비트맵에 대한 정보,데이타(각 픽셀 데이타)를 지정된 방식에 따라 구성하여 반환한다.

비트맵을 버퍼에 복사한다
● 선언
Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long

● 인수

aHDC ━ DC 핸들
hBitmap ━ 비트맵 핸들
nStartScan ━ 시작할 스캔 라인
nNumScans ━ 스캔할 라인수
lpBits ━ 비트맵의 각 비트 데이터가 저장될 버퍼
lpBI ━ 비트맵 형식
wUsage ━ 어떤 칼라를 사용할지를 나타낸다

● 반환
성공 ━ lpBits이 Null이 아니면 스캔 라인수, Null이면 0이 아닌 값
실패 ━ 0

상수
wUsage 사용, 어떤 칼라 사용하는지

상수 설명
DIB_RGB_COLORS 0 RGB 색 사용
DIB_PAL_COLORS 1 팔레트의 인덱스 사용(16-bit인덱스)

소스의 간략한 설명이다.
우선 메모리의 비트맵과 DC를 생성하고, 메모리 비트맵에 비교할 첫번째 이미지를 복사하고, 두번째 이미지를 메모리 비트맵과 XOR를 하여서 복하나다. 같은 픽셀의 같은 칼러의 픽셀은 검은색(&H00000000)이 되 버린다. GetDIBs를 사용해서 비트 데이터를 복하한후에 비트 데이터가 다 0이라면 두 이미가 같다는 것이고 0이 아닌 값이 있다면 다른것으로 간주한다.

소스 초기 이미지이다


이미지 비교 버튼을 누르면 두 이미지를 비교한다.


소스이다.
Option Explicit
Option Base 1

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDCDest As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As Any, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long ' 생성된 비트맵을 VB에서 사용가능하도록, 이미지 개체로 만든다.
Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal length As Long)
Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFOHEADER, ByVal wUsage As Long) As Long

Private Type GUID ' 이미지 개체 클래스 ID를 저장할 구조체
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

Private Type PicBmp ' VB에서 이미지 개체를 생성하기 위한 정보 구조체
    Size As Long
    Type As Long
    BitmapHwnd As Long
    hPal As Long
    Reserved As Long
End Type

Private Type BITMAP
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type

Private Type BITMAPINFOHEADER
    biSize          As Long
    biWidth         As Long
    biHeight        As Long
    biPlanes        As Integer
    biBitCount      As Integer
    biCompression   As Long
    biSizeImage     As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed       As Long
    biClrImportant  As Long
End Type

Private Const SRCCOPY = &HCC0020
Private Const SRCINVERT = &H660046
Private Const BI_RGB = 0
Private Const DIB_RGB_COLORS = 0

Public Function CreateImageDC(sPic As StdPicture) As Long ' 이미지에 대한 DC 생성
    Dim hdcPicture As Long ' 메모리 DC

   hdcPicture = CreateCompatibleDC(ByVal 0&)
   SelectObject hdcPicture, sPic.Handle
   CreateImageDC = hdcPicture
End Function

Private Function CheckBitmapBlack(ByVal ImageHandle As Long, ByVal ImageDC As Long) As Boolean ' 비트맵이 검은색인지를 판별한다. 검은색일경우 True 반환
    Dim BITMAPINFO As BITMAP
    Dim BitmapInfoHeafer As BITMAPINFOHEADER
    Dim CheckData() As Byte
   
    GetObject ImageHandle, LenB(BITMAPINFO), BITMAPINFO
    With BitmapInfoHeafer
        .biSize = LenB(BitmapInfoHeafer)
        .biWidth = BITMAPINFO.bmWidth
        .biHeight = BITMAPINFO.bmHeight
        .biPlanes = 1
        .biBitCount = BITMAPINFO.bmBitsPixel
        .biCompression = BI_RGB
    End With
    GetDIBits ImageDC, ImageHandle, 0, BITMAPINFO.bmHeight, ByVal 0&, BitmapInfoHeafer, DIB_RGB_COLORS ' 이미지의 비트 데이터 크기를얻는다
    ReDim CheckData(BitmapInfoHeafer.biSizeImage)
    GetDIBits ImageDC, ImageHandle, 0, BITMAPINFO.bmHeight, ByVal VarPtr(CheckData(1)), BitmapInfoHeafer, DIB_RGB_COLORS  ' 이미지의 비트 데이터 크기를얻는다
    CheckBitmapBlack = Len(Replace(CheckData, vbNullChar, "")) = 0
End Function

Private Sub cmdImageCompare1_Click() ' 같은 이미지 비교
    Dim Sorhdc As Long ' 소스 DC
    Dim Deshdc As Long ' 대상 DC(메모리)
    Dim DesBitmap As Long ' 대상 비트맵(메모리)
    Dim SizeX As Long ' 첫번째 이미지 박스 비트맵 크기 : X축 픽셀수
    Dim SizeY As Long ' 첫번째 이미지 박스 비트맵 크기 : Y축 픽셀수
    Dim Pic As PicBmp ' 비트맵을 OLE 개체로 생성하기 위한 비트맵 정보
    Dim IID_IDispatch As GUID ' VB에서 사용할 이미지 개체의 GUID
    Dim IPic As IPictureDisp ' VB에서 사용할 이미지 개체

    SizeX = CLng(Me.ScaleX(imgSource11.Picture.Width, vbHimetric, vbPixels)) ' 이미지박스 이지미의 픽셀 크기
    SizeY = CLng(Me.ScaleY(imgSource11.Picture.Height, vbHimetric, vbPixels))

    Sorhdc = CreateImageDC(imgSource11.Picture) ' 이미지에 대한 DC를 생성한다
    Deshdc = CreateCompatibleDC(ByVal 0&) ' 메모리 DC와 메모리 비트맵을 생성한다.
    DesBitmap = CreateCompatibleBitmap(picXor1.hdc, SizeX, SizeY)
    SelectObject Deshdc, DesBitmap ' 메모리 DC와 메모리 비트맵을 연결한다
    BitBlt Deshdc, 0, 0, SizeX, SizeY, Sorhdc, 0, 0, SRCCOPY ' 이미지 박스 이미지를 메모리 비트맵에 복사
    DeleteDC Sorhdc
    Sorhdc = CreateImageDC(imgSource12.Picture) ' 이미지에 대한 DC를 생성한다
    BitBlt Deshdc, 0, 0, SizeX, SizeY, Sorhdc, 0, 0, SRCINVERT ' 이미지 박스 이미지와 메모리 비트맵에 이미지를 XOR로 하여 복사한다
    DeleteDC Sorhdc
   
    labResult1.Caption = IIf(CheckBitmapBlack(DesBitmap, Deshdc), "같음", "다름") ' 두 이미지를 XOR 한 결과가 검은색이면 True를 반환한다
   
    DeleteDC Deshdc

    ' 메모리의 비트맵을 VB에서 사용하는 이미지 개체로 변환
    Call CLSIDFromString(StrPtr("{00020400-0000-0000-C000-000000000046}"), IID_IDispatch) ' vb에서 사용되는 GUID를 구조체에 저장한다.
    With Pic
        .Size = Len(Pic)
        .Type = vbPicTypeBitmap
        .BitmapHwnd = DesBitmap
        .hPal = 0&
    End With
    Call OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
    Set picXor1.Picture = IPic ' 생성된 이미지 개체 반환
End Sub

Private Sub cmdImageCompare2_Click() ' 다른 이미지 비교
    Dim Sorhdc As Long ' 소스 DC
    Dim Deshdc As Long ' 대상 DC(메모리)
    Dim DesBitmap As Long ' 대상 비트맵(메모리)
    Dim SizeX As Long ' 첫번째 이미지 박스 비트맵 크기 : X축 픽셀수
    Dim SizeY As Long ' 첫번째 이미지 박스 비트맵 크기 : Y축 픽셀수
    Dim Pic As PicBmp ' 비트맵을 OLE 개체로 생성하기 위한 비트맵 정보
    Dim IID_IDispatch As GUID ' VB에서 사용할 이미지 개체의 GUID
    Dim IPic As IPictureDisp ' VB에서 사용할 이미지 개체

    SizeX = CLng(Me.ScaleX(imgSource21.Picture.Width, vbHimetric, vbPixels)) ' 이미지박스 이지미의 픽셀 크기
    SizeY = CLng(Me.ScaleY(imgSource21.Picture.Height, vbHimetric, vbPixels))

    Sorhdc = CreateImageDC(imgSource21.Picture) ' 이미지에 대한 DC를 생성한다
    Deshdc = CreateCompatibleDC(ByVal 0&) ' 메모리 DC와 메모리 비트맵을 생성한다.
    DesBitmap = CreateCompatibleBitmap(picXor2.hdc, SizeX, SizeY)
    SelectObject Deshdc, DesBitmap ' 메모리 DC와 메모리 비트맵을 연결한다
    BitBlt Deshdc, 0, 0, SizeX, SizeY, Sorhdc, 0, 0, SRCCOPY ' 이미지 박스 이미지를 메모리 비트맵에 복사
    DeleteDC Sorhdc
    Sorhdc = CreateImageDC(imgSource22.Picture) ' 이미지에 대한 DC를 생성한다
    BitBlt Deshdc, 0, 0, SizeX, SizeY, Sorhdc, 0, 0, SRCINVERT ' 이미지 박스 이미지와 메모리 비트맵에 이미지를 XOR로 하여 복사한다
    DeleteDC Sorhdc
   
    labResult2.Caption = IIf(CheckBitmapBlack(DesBitmap, Deshdc), "같음", "다름")
   
    DeleteDC Deshdc

    ' 메모리의 비트맵을 VB에서 사용하는 이미지 개체로 변환
    Call CLSIDFromString(StrPtr("{00020400-0000-0000-C000-000000000046}"), IID_IDispatch) ' vb에서 사용되는 GUID를 구조체에 저장한다.
    With Pic
        .Size = Len(Pic)
        .Type = vbPicTypeBitmap
        .BitmapHwnd = DesBitmap
        .hPal = 0&
    End With
    Call OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
    Set picXor2.Picture = IPic ' 생성된 이미지 개체 반환
End Sub

오래 보관할 배를 비닐 랩으로 둘러 싼후
저온 보관 장소(냉장고나 김치 냉장고등)에 보관하면 오래 먹을수 있다.
조명이 없어서 어둡게 나왔다, 비닐 렙이 폭이 좁아서 엇갈려 두번 싼 상태이다
이대로 냉장고나 김치 냉장고에 보관하면 된다.
엑세스 2007에는 Replace라는 메크로 함수가 없다.
따라서 매크로를 만들어야 한다.
vba에는 replace 함수가 있으니 이 함수를 이용하여 매크로 함수를 만들어 줘야 한다
OleCreatePictureIndirect은 메모리의 이미지 개체를 활용하여 지정된 ID의 OLE 개체를 생성한다.

이미지 개체를 생성한다.
● 선언
Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PICTDESC, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

인수
PicDesc ━ 이미지 개체 생성시 필요한 정보가 담긴 구조체, PICTDESC 구조체 사용
RefIID ━ 어떤 개체를 만들건지를 나타내는 식별자(16바이트), GUID 구조체 사용
fPictureOwnsHandle ━ True(1)이면 생성된 이미지 개체가 파괴(소멸)될때 주어진 이미지 핸들도 같이 파괴됩니다. False
(0)이면 생성된 이미지 개체가 파괴되도 주어진 이미지 핸들은 파괴되지 않습니다.
IPic ━ 생성한 이미지 개체를 참조(저장)시킬 개체변수(VB에서 사용)

반환
성공 ━ S_OK
실패 ━ E_NOINTERFACE, E_UNEXPECTED

다은은 초기 이미지이다.

두개의 이미지 박스에 이미지가 있다 이 두 개체의 이미지를 합성 하기 위해서, 이미지 합성 버튼을 누르면, 두 이미지 개체의 메모리 DC를 우선 생성하여 이미지와 연결시켜 놓과, 메모리 DC아 메모리 비트맵을 생성하여 메모리 DC에 메모리 비트맵을 할당한다.
합성하기 전의 준비 작업은 끝낱다.
우선 첫번째 이미의 DC을 메모리 DC에 복사하고, 다음 두번째 이미지 DC를 메모리 DC의 적당한 위치에 복사한다. 그러면
두 이미지는 합성된 상태이다. 이 이미지를 OleCreatePictureIndirect을 사용하여 메모리 비트맵을 VB에서 사용할수 있는 이미지 개체를 생성하여 픽처박스에 설정하면 끝니다.

다음은 결과 이미지이다.



다음은 소스이다.
' 두 이미지 박스의 이미지 합성
' 두 이미지 DC를 메모리 DC에 복사 후, 메모리 DC에서 이미지 개체를 얻고, 그 개체를 픽처박스의 이미지로 설정
Option Explicit

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDCDest As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As Any, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long ' 생성된 비트맵을 VB에서 사용가능하도록, 이미지 개체로 만든다.
Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Type GUID ' 이미지 개체 클래스 ID를 저장할 구조체
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

Private Type PicBmp ' VB에서 이미지 개체를 생성하기 위한 정보 구조체
    Size As Long
    Type As Long
    BitmapHwnd As Long
    hPal As Long
    Reserved As Long
End Type

Private Const SRCCOPY = &HCC0020

Public Function CreateImageDC(sPic As StdPicture) As Long ' 이미지에 대한 DC 생성
    Dim hdcPicture As Long ' 메모리 DC

   hdcPicture = CreateCompatibleDC(ByVal 0&)
   SelectObject hdcPicture, sPic.Handle
   CreateImageDC = hdcPicture
End Function

Private Sub cmdImageCopy_Click() ' 이미지 복사
    Dim Sorhdc As Long ' 소스 DC
    Dim Sorhdc2 As Long ' 소스 DC
    Dim Deshdc As Long ' 대상 DC(메모리)
    Dim DesBitmap As Long ' 대상 비트맵(메모리)
    Dim SizeX As Long ' 첫번째 이미지 박스 비트맵 크기 : X축 픽셀수
    Dim SizeY As Long ' 첫번째 이미지 박스 비트맵 크기 : Y축 픽셀수
    Dim SizeX2 As Long ' 두번째 이미지 박스의 비트맵 크기 : X축 픽셀수
    Dim SizeY2 As Long ' 두번째 이미지 박스의 비트맵 크기 : Y축 픽셀수
    Dim Pic As PicBmp ' 비트맵을 OLE 개체로 생성하기 위한 비트맵 정보
    Dim IID_IDispatch As GUID ' VB에서 사용할 이미지 개체의 GUID
    Dim IPic As IPictureDisp ' VB에서 사용할 이미지 개체
   
    SizeX = CLng(Me.ScaleX(Image1.Picture.Width, vbHimetric, vbPixels)) ' 첫번째 이미지박스 이지미 픽셀 크기
    SizeY = CLng(Me.ScaleY(Image1.Picture.Height, vbHimetric, vbPixels))
    SizeX2 = CLng(Me.ScaleX(Image2.Picture.Width, vbHimetric, vbPixels)) ' 두번째 이미지박스 이지미 픽셀 크기
    SizeY2 = CLng(Me.ScaleY(Image2.Picture.Height, vbHimetric, vbPixels))
   
    Sorhdc = CreateImageDC(Image1.Picture) ' 이미지에 대한 DC를 생성한다
    Sorhdc2 = CreateImageDC(Image2.Picture) ' 이미지에 대한 DC를 생성한다
    Deshdc = CreateCompatibleDC(ByVal 0&) ' 메모리 DC와 메모리 비트맵을 생성한다.
    DesBitmap = CreateCompatibleBitmap(Sorhdc, SizeX, SizeY)
    SelectObject Deshdc, DesBitmap
   
    BitBlt Deshdc, 0, 0, SizeX, SizeY, Sorhdc, 0, 0, SRCCOPY ' 첫번째 이미지 박스 이미지를 메모리 비트맵에 복사
   
    BitBlt Deshdc, (SizeX - SizeX2) / 2, (SizeY - SizeY2) / 2, SizeX2, SizeY2, Sorhdc2, 0, 0, SRCCOPY ' 두번째 이미지 박스 이미지를 메모리 비트맵에 복사하므로 이미지 합성
   
    DeleteDC Sorhdc
    DeleteDC Sorhdc2
    DeleteDC Deshdc
   
    ' 메모리의 비트맵을 VB에서 사용하는 이미지 개체로 변환
    Call CLSIDFromString(StrPtr("{00020400-0000-0000-C000-000000000046}"), IID_IDispatch) ' vb에서 사용되는 GUID를 구조체에 저장한다.
    With Pic
        .Size = Len(Pic)
        .Type = vbPicTypeBitmap
        .BitmapHwnd = DesBitmap
        .hPal = 0&
    End With
    Call OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
    Set Picture1.Picture = IPic ' 생성된 이미지 개체 반환
End Sub


이전 예하고 크게 달라진 부분은 없다. 단지 두번째 이미지박스의 이미지에 대한 DC를 생성하여 그 이미지를 첫번째 이미지를 복사한 메모리 DC에 복사하는 코드만 다를뿐이다.

+ Recent posts