안녕하세요. 오늘은 거의 제가 사용하지 않지만 10년 넘게 개발했었던 VB 6.0 팁 코드를 적어볼까 합니다.
서버 프로그램 개발 시 사용자나 스케줄러에 의해서 이중 실행될 경우에 대한 문제가 있을텐데요.
이를 프로그램 진입 점에 이중실행 여부를 체크하여 종료시키는 중요한 코드입니다.
자체적으로 이중 실행 구문을 체크하는 코드는 다음과 같습니다.
If App.PrevInstance = True Then
Exit Sub
end if
그러나 윈도우 하나의 세션에서만 감지할 뿐 다른 세션에서 실행 시 감지를 못하는 단점이 있습니다. 보통 원격데스크탑으로 접속하면 세션이 추가로 생성되서 열리는데 여기서 실행이 되지 않았다고 판단하고 사용자가 실수로 실행을 할 수 있다는 여지가 생깁니다.
저도 이런 실수를 무지 많이 했던 기억이 납니다.
한번만 처리되어야 하는데 데이터가 이중으로 쌓여서 중복처리되는 데이터 들을 보면서 대체 왜 이러나 했는데 이런 이유였지요.
이것을 방지하기 위한 것이 세마포어 API를 이용하던가 Mutext API를 이용해야 합니다.
본 글에서는 Kernel의 Win32 API인 Mutex API를 이용해보겠습니다.
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이후 부터 시작하도록 포인터를 잡아 끌어내리면 되겠습니다.
'개발 > Visual Basic 6.0' 카테고리의 다른 글
[2022.07] 재귀 호출을 이용한 폴더 크기 구하는 함수 (0) | 2022.07.22 |
---|---|
[2022.07] 디빅도리2 (1) | 2022.07.22 |
[2022.07] 프로그램 리소스 파일들 압축기법 예제소스 (0) | 2022.07.22 |
[2022.07] Clipboard 객체 (0) | 2022.07.22 |
[2022.07] Listv의 칼럼을 데이터의 길이에 맞게 자동으로 맞추기 (0) | 2022.07.22 |