레이블이 VB인 게시물을 표시합니다. 모든 게시물 표시
레이블이 VB인 게시물을 표시합니다. 모든 게시물 표시

2017년 4월 3일 월요일

VB6 : 웹페이지 내용(Html) 불러 오기.

VB6 프로그램에서 특정 웹페이지의 내용을 불러 온다.


일단 참조를 하나 추가해야 한다.


참조에서 "Microsoft WinHTTP Service, version 5.1" 를 추가해주고....

Dim WinHttp As New WinHttpRequest

WinHttp.Open "GET", "http://daum.net"
WinHttp.Send

MsgBox WinHttp.ResponseText
이렇게 "WinHttpRequest" 로 특정 URL 을 호출한다.


그럼 이렇게 지정된 URL 의 내용을 텍스트로 가져 올수 있다.


VB6 : 날자, 시간 변경하기.

VB6 시스템의 시간 및 날자의 변경.
구문자체는 아주 간단하다.

Dim todayTime as String
todayTime = "2017-04-01 13:01:00"
DATE = Format(todayTime, "yyyy-MM-dd")
Time = Format(todayTime, "hh:mm:ss")

이렇게 간단히 시간과 날자를 바꿀수 있음.

단, 주의 할점은 Win7 이후의 운영체제에선 실행 프로그램이 "관리자 권한" 이 있을 경우에만 수정 가능하므로, 프로그램을 관리자 권한으로 실행 해야한다는 단점이 있다.

2015년 11월 23일 월요일

VB6 : 16진수를 10진수로 변환


10진수를 16진수로 바꾸는 기능이 있으면, 16진수를 10진수로 바꾸는 기능도 있어야지.


 폼은 뭐 간단히 디자인하고.



Private Sub Command1_Click()
        
    Text2.Text = Hex2Dec(Text1.Text)

End Sub

Public Function Hex2Dec(HexNum As String) As Double
    Dim DecNum As Double
    Dim getHex As String
    
    getHex = "0123456789ABCDEF"
    
    For i = 1 To Len(HexNum)
        If InStr(getHex, Mid$(HexNum, i, 1)) > 0 Then
            DecNum = (DecNum * 16) + InStr(getHex, Mid$(HexNum, i, 1)) - 1
        Else
            MsgBox ("16진수 값이 아닙니다.")
        End If
    Next i
    
    Hex2Dec = DecNum
End Function

소스는 심플... 하지만 조금 이해하기 난해하긴 함.
가장 쉬운 방법은 그냥 문자열을 하나씩 잘라서 ...

if getChar = "A" then
    DecNum = (DecNum * 16) + 10
else if getChar = "B" then
    DecNum = (DecNum * 16) + 11
    .
    .
    .
end if


이런 식으로 비교해서 값을 계산하면 됨.
이걸 If 문 대신, 순서대로 나열된 비교 문자열을 가지고 inStr() 함수를 이용해 ABCD... 값을 변환 한것 일뿐, 다를 것은 없음. ("A" 는 비교 문자열의 11번째에 위치함.)

요렇게 하고, 값 변환 테스트.


일단 간단히 "A" 를 변환해봄. 10으로 잘 나옴.


당연히 큰 값도 잘 나옴.

VB6 : 10진수를 16진수로 변환

시리얼 통신을 하다 보니 16진수 변환 기능이 필요하다.


폼을 대충 이렇게 만들고.


소스를 이렇게 ...
원리는 간단. 입력 받은 값을 그냥 16으로 나누기를 반복 하면서 나머지 값을 차곡 차곡 쌓아, 최종적으로 나눌값이 16 보다 작아질때 까지 반복하면 끝.

Private Sub Command1_Click()
    If IsNumeric(Text1.Text) Then
        Text2.Text = Dec2Hex(Val(Text1.Text))
    End If
End Sub

Public Function Dec2Hex(DecNum As Long) As String
    Dim hexv As String, na As Long
    hexv = ""
    
    Do While DecNum > 0
        na = DecNum Mod 16
        
        Select Case na
            Case 10
                hexv = "A" + Trim(hexv)
            Case 11
                hexv = "B" + Trim(hexv)
            Case 12
                hexv = "C" + Trim(hexv)
            Case 13
                hexv = "D" + Trim(hexv)
            Case 14
                hexv = "E" + Trim(hexv)
            Case 15
                hexv = "F" + Trim(hexv)
            Case Else
                hexv = Str(na) + Trim(hexv)
        End Select
    
        If DecNum >= 16 Then
            DecNum = Int(DecNum / 16)
        Else
            hexv = "0" + Trim(hexv)
            Exit Do
        End If
    Loop
    
    If Len(hexv) > 1 And (Len(hexv) Mod 2 = 1) Then
        Dec2Hex = Mid(hexv, 2)
    Else
        Dec2Hex = hexv
    End If
End Function


간단하게 테스트

10진수 "10" 이 16진수 "0A" 로 변환 되었다.


복잡한 숫자로 OK



계산기로 제대로 전환 되는가 확인해 보니, 잘 된다.


VB6 : 함수명에 붙는 "$" 표시는 "String" 형 이라는 뜻이다.

가끔 VB6 소스를 보다보면 같은 함수 인데 어떤 경우는 $가 붙어 있고, 어떤 경우는 $가 붙어 있지 않는 경우가 있다.


여기에는 Dir$() 인데...

여기는 Dir() 임...
이게 참 헷갈리는게, Dir$() 를 Dir() 로 바꾸고 해도 잘 동작함.

사실은, 그냥 같은 함수.
다른 점이 있다면, "$" 붙은 경우는 리턴값이 "String" 형 이고 "$" 가 붙지 않은 경우는 리턴값이 "Variant" 형이라는 것만 다를 뿐.

어차피 VB 는 형변환이 느슨한 언어라 사용에는 거의 차이가 없음.
단지 "$" 로 지정 했을 경우 속도가 좀더 빠를 것이라는 생각에 VB 를 오래 다루던 사람들은 "$" 를 붙이는 경우가 많은 듯...




2015년 7월 30일 목요일

VB6 : 경로에서 파일명, 드라이브명 추출하기

일단 화면을 간단히 디자인.


"파일" 버튼을 클릭하면 파일명을, "드라이브" 버튼을 클릭하면 드라이브 명을 가지고 온다.

"파일명"을 가져오는 기능은 경로에서 가장 왼쪽의 "\" 위치를 구해, 그 위치 이후의 문자열을 가지고 오면 되고.

"드라이브명"을 가져오는 기능은 "\" 을 기준으로 경로 문자열을 잘라서, 가장 처음의 문자열이 드라이브 명이다.


소스는 이렇고...


"파일" 을 클릭하면 파일명을...


"드라이브" 를 클릭하면 드라이브 명을 가져온다.


2015년 6월 19일 금요일

VB6 : "sendkeys" 가 사용권한이 없다며 오류가 날때.

아...
예전 프로그램 중 하나가 특정 컴퓨터에서 오류를 발생시키며 종료가 안된다.

왜 그런가... 찾아보니, "sendkeys" 를 이용해서 "F4" 키를 보내 다른 프로그램을 종료를 시켜야 하는데, 이게 권한 문제로 막혀버리는 문제가 있었다.
즉, '사용자 계정 콘트롤(UAC)' 문제.

이럴경우 "관리자권한" 으로 프로그램을 실행시키면 대개는 해결이 된다.

문제는... 이 프로그램은 "관리자권한" 으로 실행 시켜도 소용이 없다는것...
더 큰 문제는 다른 컴퓨터는 되는데, 단 1대의 컴퓨터에서만 안된다는것...

물론 '사용자 계정 콘트롤(UAC)'을 사용하지 않게 하면 간단히 해결되겠으나, 그럴수도 없다.

결국 꼼수.
문제가 있는 소스에다 아래 함수를 추가 한다.

Public Sub Sendkeys(text$, Optional wait As Boolean = False)
   Dim WshShell As Object
   Set WshShell = CreateObject("wscript.shell")
   WshShell.Sendkeys text, wait
   Set WshShell = Nothing
End Sub

즉, 원래 Sendkeys 라는 API 를 같은 소스내에 Sendkeys 라는 Sub Function 만들어 대체하게 만들어 버림.

이렇게하니 좀 불안하긴 하지만, 어쨌든 잘 돌아 간다.

2015년 4월 14일 화요일

VB6 USB 메모리 스틱 연결시 연결된 드라이브 찾기

프로그램이 실행되고 있는 도중에 USB 메모리 스틱을 연결하면 그 드라이브를 찾는 방법.


우선 이렇게 폼에 타이머를 놓는다.
USB 드라이브를 찾을수는 있지만, 연결 시점을 바로 알아차릴수는 없으므로, 주기적으로 연결여부를 체크해야 한다.


Option Explicit

Private Sub Form_Load()
    Label1.Caption = "USB 없음"
    Timer1.Enabled = True
    Timer1.Interval = 5000
End Sub

Private Sub Timer1_Timer()

    Dim FSO         As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
   
    Dim objDrive    As Object
    Dim strDrive    As String
    Dim boolUSB     As Boolean
       
    strDrive = ""
    boolUSB = False
   
    For Each objDrive In FSO.Drives
        If objDrive.DriveType = 1 Then
            If objDrive.ISREADY = True Then
                strDrive = objDrive.DriveLetter
                boolUSB = True
            End If
        End If
    Next
   
    If boolUSB = True Then
        Label1.Caption = "USB 가 " & strDrive & ": 드라이브로 연결되었습니다."
    Else
        Label1.Caption = "USB 없음"
    End If
   
End Sub

그리고 위와 같이 체크한다.
실질적으로는 빨간색 테두리 부분이 USB 드라이브 연결 여부를 체크하는 부분.

즉, objDrive.DriveType = 1 이면 USB 드라이브 이며.
objDrive.ISREADY = True 이면 해당 드라이브를 사용 할 수 있는 상태라는 것이다.

요걸 실행 시켜보면...


최초 실행시에는 이렇다가...


메모리 스틱을 연결하고 그것을 드라이브로 인식이 되면, 해당 드라이브의 드라이브 명을 찾아 온다.

일반적으로 메모리 스틱이나 외장형 하드 같은 USB 로 인식이 되는 드라이브는 다 찾아 낸다.
물론 이 소스는 여러개의 USB가 연결되는 경우는 고려하지 않은 소스이므로 필요하다면 좀더 수정을 해야 할 것이다.

2015년 4월 8일 수요일

VB6 에서 실행중인 다른 프로세스를 종료시키기

VB6에서 다른 프로세스를 컨트롤 할수 있을까?
보통 VB6 는 좀 많이 무시받는 경향이 있지만, 그래도 될거는 다 된다.


일단 간단하게 창을 하나 생성하고 버튼을 넣은다음에...
간단한 소스를 삽입한다.


그리고 그냥 아무 프로그램이나 제물이 될 프로그램을 하나 실행한다.
이번에는 "putty.exe" 로 테스트.


이렇게 프로세스가 실행되어 있는 것을확인하고.


VB 프로그램을 실행하고, 버튼을 클릭... 하면.


종료 성공.
이제 프로세스를 확인해보자.


프로세스가 종료되어 목록에서 사라졌다.
만약 동일한 프로세스가 여러개 있다면?


이렇게 2개를 띄우고 (더 많이 띄워도 상관없다) 다시한번 종료시켜 보자.


이렇게 종료 시키면...


보다 시피 동일한 프로세스는 모두 사라진다.
문제는 "프로세스명 (실행파일명)" 을 기준으로 종료 시켜 버리기 때문에, "같은 프로세스명"을 가진 다른 프로세스라도 모두 종료시켜버리므로, 사용시에 오동작을 방지하기 위해 조심해서 사용할 필요가 있다.





2015년 3월 12일 목요일

VB6 "컨트롤을 로드할 수 없습니다. 사용 권한을 찾을 수 없습니다." 혹은 "이 구성 요소에 대한 사용 권한 정보를 찾을 수 없습니다. 디자인 환경에서 이 기능을 사용할 수 있는 사용 권한이 없습니다" 라고 뜰때

예전 소스를 열어보는데 난데 없이 오류가 난다.
로그를 보니...


이건또 뭔가...
혹시나 싶어 컨트롤을 지우고 새로 등록하면 해결 될까... 싶어서 해봤더니...


컨트롤을 삽입하려고 하면 이렇게 뜬다.


혹시나... 해서 살펴보지만, 이미 구성요소에는 잘 등록되어 있다.

문제는... 내 컴퓨터에선 잘 되는데, 다른 사람 컴퓨터에선 이렇게 된다는것.
검색해보니 라이센스 문제라 새로 설치하면 된다는둥, regsvr32로 등록하면 된다는둥...
하지만, 이건 원래 설치되어 있는거라 재설치도 안되고...

흠... 결국 이건 라이센스 문젠데, 이걸 해결 하는 패치가 있다.
마이크로소프트 고객지원 센터에서 다운 받으면 됨.

http://support.microsoft.com/kb/194751/ko



이 패치로 해결할수 있는 컴포넌트의 종류는 아래와 같다.

ActiveX 컨트롤                           파일 이름        버전          에디션
-------------------------------------------------------------------------
ADO Data Control 6.0                 MSADODC.OCX    6.00.8171    L,P,E
Chart Control 6.0                   MSCHRT20.OCX    6.00.8177      P,E
Comm Control 6.0                    MSCOMM32.OCX    6.00.8169      P,E
Common Dialog Control 6.0           COMDLG32.OCX    6.00.8169    L,P,E
Data Bound List Controls 6.0        DBLIST32.OCX    6.00.8169    L,P,E
DataGrid Control 6.0                MSDATGRD.OCX    6.00.8169    L,P,E
DataList Controls 6.0               MSDATLST.OCX    6.00.8169    L,P,E
DataRepeater Control 6.0            MSDATREP.OCX    6.00.8169      P,E
FlexGrid Control 6.0                MSFLXGRD.OCX    6.00.8169    L,P,E
Hierarchical FlexGrid Control 6.0   MSHFLXGD.OCX    6.00.3005    L,P,E
Internet Transfer Control 6.0         MSINET.OCX    6.00.8169      P,E
MAPI Controls 6.0                   MSMAPI32.OCX    6.00.8169      P,E
Masked Edit  Control 6.0            MSMASK32.OCX    6.00.8169      P,E
Multimedia Control 6.0                 MCI32.OCX    6.00.8169      P,E
PictureClip Control 6.0             PICCLP32.OCX    6.00.8169      P,E
RemoteData Control 6.0               MSRDC20.OCX    6.00.8169        E
Rich Textbox Control 6.0            RICHTX32.OCX    6.00.8169    L,P,E
SysInfo Control 6.0                  SYSINFO.OCX    6.00.8169      P,E
Tabbed Dialog Control 6.0           TABCTL32.OCX    6.00.8169    L,P,E
Windows Common Controls-3 6.0       COMCT332.OCX    6.00.8169      P,E
Windows Common Controls 5.0 (SP2)   COMCTL32.OCX    6.00.8022    L,P,E
Windows Common Controls 6.0         MSCOMCTL.OCX    6.00.8177    L,P,E
Windows Common Controls-2 5.0 (SP2) COMCT232.OCX    6.00.8022    L,P,E
Windows Common Controls-2 6.0       MSCOMCT2.OCX    6.00.8177    L,P,E
Winsock Control 6.0                 MSWINSCK.OCX    6.00.8169      P,E

L = Learning Edition
P = Professional Edition
E = Enterprise Edition
    

이럴때 보면, 이렇게 오래전 패치파일들이 아직까지 제공되는 마소도 참 대단하다...
암튼. 이걸 압축을 풀어서 보면...

이렇게 파일들이 있는데...


이 "VBC6.exe" 파일을 "관리자 권한"으로 실행해준다.

이렇게 성공 메시지가 나온다.
이제 해당 프로젝트를 다시 열어보면 정상적으로 열릴것이다.



2015년 3월 7일 토요일

VB6 에서 새로 추가한 판넬에 기존 컨트롤을 이동 시키기

요즘의 개발툴은 기능이 많이 좋아서져 뭔가 뜻대로 잘 되지만, 과거의 개발툴인 VB6 는 뭔가 내 뜻대로 되지 않는 경우가 많다.

프레임을 만들어서 관리하다가, 기존 컨트롤을 특정 프레임에 넣고 싶을 때가 있는데, 이게 좀처럼 뜻대로 되지 않는다.


사실, VB6의 자체 기능으로는 해결이 안된다.


그래서 어쩔수 없이 직접 파일을 수정해 주는수 밖에는 없다.
편집할 폼 파일을 텍스트 에디터로 열어서...


옮기고 싶은 컨트롤을 찾자.


그리고, 이 부분을 넣고 싶은 프레임의 하위에 넣어 준다.
그리고, 프로젝트를 재로드 (그냥 종료하고 다시 불러오면 됨)... 하면...


컨트롤이 없어졌다...
싶지만...


프레임의 크기를 키워보면 제대로 등록되어 있는게 보일 것이다.



2015년 2월 27일 금요일

VB6, Win7에서 Microsort window common controls 6.0 컨트롤 등록이 안될때

예전 소스를 열어보니.


라고... 뜬다.

Win7 에서 VB6로 개발 하다보면 자주 보는일이니... 뭐...


대체 뭐가 맘에 안들어서 그러는지, log 를 본다.


흠....

저건 Microsort window common controls 6.0 이 없어서 나는 오류다.


"프로젝트 > 구성요소..." 로 가서...


"Microsort window common controls 6.0" 를 체크해 구성요소를 등록해 준다.


... 쉣...



어라?... "C:\Windows\SysWOW64" 에 보니 파일이 있는데?

...

원래는 정상적으로 등록되어야 하나, Window7 에선 그냥 등록이 안된다.
그러니...

 "C:\Windows\SysWOW64" 로 이동해서...


수동으로 등록을 해주자...

regsvr32 mscomctl.ocx
regtlib msdatsrc.tlb

... 라고 치면 된다.
가끔 "regsvr32 mscomctl.ocx" 만 치고 안된다고 하는 사람이 있는데, "regtlib msdatsrc.tlb" 이거 까지 다 쳐 줘야 된다.

그러면...


딱... 등록이 된다.