일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- EnvDiv
- Menu
- autohotkey
- StringGetPos
- if
- Threads
- IfWinExist
- ControlSend
- IfInString
- if(식)
- ControlGetText
- SetControlDelay
- EnvSub
- EnvSet
- EnvAdd
- 배열
- 함수
- SetKeyDelay
- SetMouseDelay
- 식의 설명
- 식
- Var:=식
- SetEnv
- API
- Blocks
- MouseClick
- DetectHiddenWindows
- EnvMult
- SetTitleMatchMode
- IF (식)
- Today
- Total
ㄴrㅎnㅂrㄹrㄱi
CreateMutex(A) 본문
CreateMutex(A)
뮤텍스 오브젝트를 작성합니다.
HANDLE CreateMutexA( PSECURITY_ATTRIBUTES psa, // 시큐러티 지정자 BOOL bInitialOwner, // 소유권 지정 플래그 PCTSTR pszMutexName // 오브젝트의 이름 );
KERNEL32.DLL
인수
- psa
-
오브젝트의 보호 속성을 설정한다 SECURITY_ATTRIBUTES 구조체의 주소를 지정합니다.이 구조체에, child process에 핸들을 계승할지의 정보를 격납해 둡니다.
0 (NULL) (을)를 지정하면 핸들을 계승하지 않습니다.
Windows NT/2000/XP: SECURITY_ATTRIBUTES 구조체의 lpSecurityDescriptor 멤버로 시큐러티 기술자를 설정합니다. 0 (NULL) (을)를 지정하면 디폴트의 시큐러티 기술자가 사용됩니다.
Windows 95/98/Me: SECURITY_ATTRIBUTES 구조체의 lpSecurityDescriptor 멤버는 무시됩니다.
- bInitialOwner
-
초기 상태의 뮤텍스 오브젝트의 소유권을 작성 스렛드에게 줄지를 지정합니다. 1 (TRUE) (을)를 지정하면 오브젝트의 소유권은 작성 스렛드에 건너, 오브젝트는 논시그날 상태가 됩니다. 0 (FALSE) (을)를 지정하면, 소유권을 요구하지 않습니다.
- pszMutexName
-
뮤텍스 오브젝트를 식별하는 이름의 문자열에의 포인터를 지정합니다.이름에는 backslash(\) 이외의 임의의 문자를 사용할 수 있습니다.또, 대문자·소문자는 구별됩니다.최대 문자열 사이즈는 260 (MAX_PATH) 입니다.
지정한 이름의 뮤텍스 오브젝트가 벌써 작성되고 있는 경우에는, 기존의 오브젝트에 대해서 MUTEX_ALL_ACCESS 액세스를 요구합니다.이 때, bInitialOwner 파라미터는 무시됩니다.또, psa 파라미터가 가리킨다 SECURITY_ATTRIBUTES 구조체의 시큐러티 기술자는 무시됩니다.
0 (NULL) (을)를 지정하면, 이름 없음의 오브젝트가 작성됩니다.
지정한 이름이 벌써 작성되고 있는 뮤텍스 이외의 이름 첨부의 커넬 오브젝트의 이름과 일치하면, 함수는 실패합니다.이것은, 커넬 오브젝트가 같은 네임 스페이스(이름 공간)를 공유하고 있기 위해서 일어납니다.
터미널 서비스: 터미널 서버에서는, 글로벌 또는 세션의 네임 스페이스(이름 공간)에서 명시적으로 뮤텍스 오브젝트를 관리시키기 위해서, "Global\" 또는 "Local\" 의 프레픽스를 붙일 수 있습니다.나머지의 이름은, backslash 「 \ 」이외의 모든 문자를 사용할 수 있습니다.
Windows NT/2000/XP: 고속의 유저 변환은 터미널 서비스 세션을 사용해 행해집니다.최초의 유저에서는 세션 0 하지만, 다음의 유저에서는 세션 1 하지만, 과 같이 사용됩니다.어플리케이션이 복수의 유저를 서포트할 수 있도록 하려면 , 커넬 오브젝트의 이름은, 터미널 서비스의 가이드 라인에 따라서 않으면 안됩니다.
Windows 2000: 터미널 서비스가 실행되어 있지 않은 경우에는, "Global\" 및 "Local\" 의 프레픽스는 무시됩니다.나머지의 이름은, backslash 「 \ 」이외의 모든 문자를 사용할 수 있습니다.
Windows NT 4.0 이전: backslash 「 \ 」이외의 모든 문자를 사용할 수 있습니다.
Windows 95/98/Me: backslash 「 \ 」이외의 모든 문자를 사용할 수 있습니다.공문자열 "" 도, 오브젝트의 이름으로서 유효합니다.
반환값
성공하면, 작성된 뮤텍스 오브젝트의 핸들이 돌아갑니다.벌써 존재하는 오브젝트의 핸들이 돌려주어졌을 경우, 직후에 실행했다 GetLastError 함수는 183 (ERROR_ALREADY_EXISTS) (을)를 돌려줍니다.
실패하면 0 (NULL) 하지만 돌아갑니다.확장 에러 정보를 취득하려면 , GetLastError 함수를 사용합니다.
해설
뮤텍스 오브젝트는, 스렛드에 소유되고 있는 경우는 논시그날 상태에, 어느 스렛드에도 소유되어 있지 않은 경우는 시그널 상태가 됩니다.
기존의 뮤텍스에 대해서 소유권을 요구하려면 , 대기 함수 ( WaitForSingleObject 함수 등) (을)를 사용합니다.이 때, 뮤텍스가 시그널 상태(어느 스렛드에도 소유되어 있지 않다)라면, 즉시 소유권이 주어집니다.뮤텍스가 논시그날 상태(몇개의 스렛드에 소유되고 있다)라면, 그 소유 스렛드가 소유권을 해방할 때까지 대기합니다.그리고 소유권이 해방되면, 대기중의 스렛드 중 하나에 소유권이 주어져 뮤텍스는 논시그날 상태가 되어, 대기 함수는 제어를 돌려줍니다.뮤텍스를 소유할 수 있는 스렛드는, 한 번에 하나 뿐입니다.소유권을 해방하려면 , ReleaseMutex 함수를 사용합니다.
복수의 프로세스로 CreateMutex 함수를 사용해, 같은 이름의 뮤텍스를 작성할 수 있습니다.이 때, 최초로 함수를 호출한 프로세스에서는 실제로 뮤텍스가 작성되어2 번째 이후의 프로세스에서는 기존의 뮤텍스의 핸들이 오픈됩니다.이 수법을 사용할 때는, bInitialOwner 파라미터에 0 (FALSE) (을)를 지정할 필요가 있습니다.그렇게 하지 않으면 어느 스렛드가 소유권을 갖고 있는지의 판별이 어려워질 우려가 있습니다.
핸들을 클로우즈 하려면 , CloseHandle 함수를 사용합니다.프로세스의 종료시에는, 시스템이 자동적으로 핸들을 클로우즈 합니다.마지막 핸들이 클로우즈 되면, 뮤텍스 오브젝트는 파기됩니다.
대응 정보
Windows 95 이후 / Windows NT 3.1 이후
'API 관련 > Win32 API 함수' 카테고리의 다른 글
CreatePopupMenu (0) | 2007.11.08 |
---|---|
CreatePolygonRgn (0) | 2007.11.08 |
CreateMenu (0) | 2007.11.08 |
CreateFontIndirect(A) (0) | 2007.11.08 |
CreateFont(A) (0) | 2007.11.08 |