본문 바로가기
다물칸 주소복사
조회 수 3664 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
구분 팁&트릭

같은 세션내에서 동일한 프로세스가 돌아가지 않도록 하는 부분은 서버 프로그래밍 시 중요한 부분입니다. 

우선 프로그램 시작 부분에 다음 구문을 추가합니다.  < Sub Main()또는 Form_load()함수. >


 Sub Main()
    If App.PrevInstance = True Then
        Exit Sub
    end if

 

 
그러나 원격 데스크탑(RDS)이 가능한 서버에서 구동시 원격 붙을 때마다 세션을 다시 열어대는 OS때문에 위 구문으로는 또 프로그램이 실행되고 맙니다. 이것을 방지하기 위한 것이 세마포어 API를 이용한던가 Mutex API함수를 이용합니다.

 

이번에 소개해 드릴 구문은 Mutex를 이용합니다.

 

Const ERROR_ALREADY_EXISTS = 183&

Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As Any, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

위 구문을 모듈에 선언합니다. 

 

 Sub Main()
    'Try to create a new Mutex
    g_HMutex = CreateMutex(ByVal 0&, 1, App.Title)
    'Did the mutex already exist?
    If (err.LastDllError = ERROR_ALREADY_EXISTS) Then
        'Clean up
        ReleaseMutex g_HMutex
        CloseHandle g_HMutex
        'More than one instance detected
        MsgBox "이미 프로그램이 실행중입니다.", vbOKOnly + vbInformation, App.Productname
        End
    Else
        '프로그램 실행해도 됨.
    End if

 

 기본 구문대신 이런식으로 하시면 됩니다.

 주의할 점은 VB 6.0 소스 디버깅 시 정상적인 종료가 아닌 VB 6.0에서 그냥 종료시 Mutex정보가 남기 때문에 재실행 시 디버깅을 할 수 없는 상황이 발생이 됩니다. 정상적으로 종료하던가? 위 코드부분 중 IF문에 Break point를 잡아 강제로 Else이후 부터 시작하도록 포인터를 잡아 끌어내리면 되겠습니다.