2009-08-13 7 views
0

내 프로그램에서 (kernel32.dll)의 WaitForSingleObject을 사용 중입니다.64 비트 OS에서 WaitForSingleObject를 사용할 때의 문제점

32 비트 Windows XP에서 제대로 작동하지만 64 비트 WindowsXP에서 사용할 때 작동하지 않습니다.

문제는 프로세스를 기다리지 않고 컨트롤이 앞으로 나아가는 것입니다.

이유에 대해 알 수있는 사람이 있습니까?

WinXP 64bit에서이 방법을 대체 할 수 있습니까?

+3

예제 코드를 게시 할 수 있습니까? –

+0

프로세스가 wow64 에뮬레이션에서 실행되고 있습니까 아니면 기본 x64 응용 프로그램입니까? 물론 이것은 x64 용으로 지원되는 API입니다. –

+1

그것은 simlple exe 파일이며 32 비트 프로세스로 실행됩니다 .... –

답변

3

WaitForSingleObject 함수는 프로세스가 이미 "신호를 받았다"(WAIT_OBJECT_0)거나 오류가 발생했음을 알려줍니다. 어떤 것을 알기 위해서는 그것이 무엇이 돌아가는지 알 필요가 있습니다. 반환 값이 WAIT_OBJECT_0 또는 WAIT_TIMEOUT이 아닌 경우 무엇이 잘못되었는지 확인하려면 GetLastError()으로 전화해야합니다.

내가 프로세스 초기화 중 하나가 실패했음을 추측 것입니다, 당신은 GetLastError() == ERROR_INVALID_HANDLEWAIT_FAILED을 얻고, 또는 프로세스가 이미 종료 된 당신이 WAIT_OBJECT_0을 얻고 있지만, 자세한 내용없이 우리가 정말 당신을 도울 수 있습니다.

+0

프로세스가 성공적으로 시작되었고, 대신에 WAIT_OBJECT_0을 얻지 만 문제는 자식 EXE가 완료 될 때까지 기다려야한다는 것입니다.이 작업은 수행하지 않습니다 ... –

4

함수의 반환 값이 프로세스가 종료되었음을 알리는 경우 실제로 발생합니다.

시작 프로그램에 32 비트 및 64 비트 버전이 있다고 가정 해보십시오. 어쩌면 32 비트 버전이 64 비트 플랫폼에서 실행 중임을 감지하고 64 비트 버전을 시작한 다음 32 비트 버전을 종료 할 수 있습니다. 이 경우 프로그램은 32 비트 자식의 종료를 감지하지만 64 비트 "손자"프로세스는 인식하지 못합니다.

이 가설을 확인하기 위해 작업 관리자 나 프로세스 탐색기를 사용할 수 있습니다. 아직 실행중인 프로그램을 찾으십시오. 해당 pid는 CreateProcess이 반송 된 pid와 동일합니까?

+0

나는 그 제안을 좋아합니다. 꽤 그럴듯한 것 같습니다. –

+0

SysInternals 유틸리티는이 작업을 수행하며 32 비트 및 64 비트 실행 파일을 사용자 지정 실행 프로그램과 함께 번들로 제공합니다. 그것은 또한 Windows 자체가 wow64와 같은 것을하고있을 가능성이 있습니다 ... –

0

나는 Rob에 동의한다. WinAPI가 잘못되었다는 것은 확실하지 않다 : 그것이 종료되었다고한다면, 그렇다.

어떻게 든 하위 프로세스의 출력을 따르십니까? 초기화 초기에 실패했을 가능성이 있습니다 (예 : 잘못된 플랫폼 (32/64)에 대한 DLL을로드하려고 할 때 플랫폼 등에 따라 잘못된 위치를 가리키는 환경 변수를 얻는 중입니까?

0

약간의 검색은 tcsh 구현이 코드를 설정 : 그들은 같은 문제를했을 수 있습니다처럼

http://www.opensource.apple.com/source/tcsh/tcsh-60/tcsh/win32/fork.c

것 같습니다 ("의 WaitForSingleObject"의 두 번째 인스턴스 검색) 네가 한거야. WFSO는 주석 처리되고 새 프로세스와 기존 프로세스가 통신하는 데 사용하는 공유 이벤트 세트로 대체됩니다. 아마도 이것은 공통적 인 문제이거나 아직 해결되지 않은 창 버그 일 것입니다.

관련 문제