2010-07-28 3 views
1

기존 유틸리티 응용 프로그램이 있으므로 util.exe라고합시다. 명령 줄에서 입력을 받아서 디스크에 파일을 만듭니다. 이미지 파일을 보겠습니다.Win32 응용 프로그램에서 동기 작업으로 프로세스 실행

util.exe를 실행하여 다른 응용 프로그램 내에서 사용하고 싶습니다. 그러나 처리가 계속 될 때 파일이 존재하는 것으로 알려져 있으므로 동기되어야합니다.

예컨대 (psudeo)

bool CreateImageFile(params) 
{ 
    //ret is util.exe program exit code 
    int ret = runprocess("util.exe",params); 
    return ret==0; 
} 

과정을 실행하고 종료 할 때까지 대기 한 하나의 Win32 API 호출이 있습니까? CreateProcess를 보았지만 시작하려고하자마자 ShellExecute를 보았지만 조금이라도 추한 것처럼 보였습니다 동기였습니다.

+0

당신은 이미 ShellExecute를 언급하여 자신의 질문에 대답합니다 ... – YeenFei

+0

비트 못생긴, 그렇지 않습니까? 게다가 내 프로그램 반환 코드를 다시 가져올 지 확신 할 수 없다. 시도했을 때 42의 무작위 값을 얻었다. :) –

답변

3

단일 API는 없지만 실제로 이것은 Win32 앱에 대한보다 일반적인 흥미로운 질문입니다. 프로세스 핸들에서 CreateProcess 또는 ShellExecuteEx 및 WaitForSingleObject를 사용할 수 있습니다. 이 시점에서 GetExitCodeProcess는 프로그램의 종료 코드를 제공합니다. 간단한 샘플 코드는 here을 참조하십시오.

그러나 주 스레드를 완전히 차단하고 일부 Win32 메시징 시나리오에서 심각한 교착 상태 문제를 일으킬 수 있습니다. 스폰 된 exe가 브로드 캐스트 sendmessage를한다고 가정 해 봅시다. 모든 창에서 메시지가 처리 될 때까지 진행할 수는 없지만 기다리는 동안 차단되어 있기 때문에 계속할 수 없습니다. 이중 자물쇠. 순수 커맨드 라인 프로그램을 사용하고 있기 때문에이 문제는 아마도 여러분에게 적용되지 않을 것입니다. 명령 줄 프로그램이 잠시 멈 추면 신경 써야합니까?

정상적인 앱을위한 가장 좋은 해결책은 프로세스 실행 및 대기를 스레드로 분할하고 스레드가 완료 될 때까지 주 창에 메시지를 게시하는 것입니다. 메시지를 받으면 계속 진행하는 것이 안전하며 교착 상태가 발생하지 않는다는 것을 알고 있습니다.

1

프로세스 핸들은 대기 가능한 객체 인 AFAIK입니다. 이것이 바로 당신이 필요로하는 것입니다.

그러나 그런 식으로하는 것이 좋습니다. Windows에서 프로세스를 시작하면 속도가 느려지고 UI가 차단됩니다. Windows 응용 프로그램에서 50ms의 대기 시간 초과가있는 PeekMessage 루프를 고려하십시오.

+0

http://support.microsoft.com/kb/125212 WaitForSingleObject를 사용하여 온라인으로 몇 군데를 볼 수 있지만이 페이지는 더 이상 작동하지 않는다고 말합니다. 또는 32 비트에서 16 비트 exes를 생성하는 것에 대해 이야기하는 것일까 요? –

+0

메시지 루프는 어떻게 도움이됩니까? 어떻게 든 프로세스를 생성해야합니까? 또한, 파일이 생성되는 동안 전체 지점이 애플리케이션이 일시 중지되면 차단해야합니다. –

+0

Windows에서 프로세스를 만드는 것은 느릴 수 있지만 프로세스를 종료하는 데 걸릴 시간과 비교할 수 없습니다. 그래서 여기서 중요한 CreateProcess()를 넣을 곳이 아니라 WaitForSingleObject()입니다. 어쨌든 GUI 응용 프로그램이나 콘솔을 작성하고 있습니까? (물론 순차적 인 콘솔 어플리케이션을 차단하는 것은 괜찮습니다) –

관련 문제