Error code 2: The system cannot find the file specified.

1641 단어 테크니컬
일반적인 클라이언트 PC에서 이것은 그리 대단한 문제가 아니다.서버 응용 환경에서 큰 골칫거리이기 때문이다.다음 코드를 생각해 보십시오.
// Process 1:

......

HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, _T("my_private_event_name")); //        

......

// Process 2:

HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("my_private_event_name")); //      ???


두 장면을 상상해 보면,
1. 일반 사용자 호출.즉 사용자가 먼저 프로세스 1을 시작한 다음에 프로세스 2를 시작하는 것이다.
2. 사용자가 먼저 프로세스 1을 시작하고 프로세스 2는 스크립트 언어로 호출된다(예를 들어 asp, 데이터베이스 저장 프로세스...).
첫 번째 상황에서는 기본적으로 문제가 생기지 않을 것이 분명하다.문제는 두 번째 응용 환경!
이런 상황에서 불행하게도 당신이 직면한 것은 "The system cannot find the file specified"오류입니다!이게 어디에 문제가 생겼을까--권한?만약 이렇게 간단하다면, 단독으로 이 문제를 기록할 필요가 없다.나도 이 위에서 오전 내내 시간을 낭비했다. 문제의 최종 근원은 바로'명명공간'에 있다!익숙하죠?하지만 이건 정말 상상도 못했어!!!커널 대상인 만큼 OS 전역에 존재해야 하고 어떤 앱이든 찾아볼 수 있는데 왜 이름을 붙여서 못 찾지?이는 커널의 이름이 OS 내부에 있다고만 할 수 있고 이름 공간으로 구분돼 저장된다.두 프로세스가 explorer나 cmd를 통해 시작될 때, 이 이름들은 같은 공간에 저장됩니다.그러나 스크립트 언어가 이 프로세스를 호출할 때, 이 하위 프로세스는 부모 프로세스 (스크립트 언어) 의 일부 특성을 계승할 수 있습니다. 내부 핵 대상의 이름 공간을 포함합니다.이렇게 하면 서로 다른 응용 환경에서 두 개의 프로세스를 시작할 때 일반적인 상황에서 문제가 발생하지 않는 API에 문제가 생기는 것을 발견할 수 있습니다. 이름 공간이 다르기 때문에 이름을 통해 핵 대상을 찾는 데 실패합니다. (ErrorCode: 2)!
이 문제의 최종 해결 방법은 내부 핵 대상의 이름에 전체 국면의 명칭 공간을 더하는 것이다. 즉, 상기 두 단락을 다음과 같이 바꾸는 것이다.
//Process 1:
......

HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, _T("Global\\my_private_event_name"));	//        

......





// Process 2:

HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("Global\\my_private_event_name")); //      ???

 
이 재난을 겪은 후에 유사한 코드를 쓸 때는 모두'Global'의 명칭 공간을 붙이는 것이 가장 좋다.

좋은 웹페이지 즐겨찾기