문제

서비스에서 다른 프로세스를 시작하려고 노력하고 있습니다 (일부 데이터를 수집하고 레지스트리에 작성하는 콘솔 앱입니다). 어떤 이유로 든 제대로 시작할 수는 없습니다.

나는 내가하려는 일의 기본 사항은 다음과 같습니다.

  1. 프로세스를 시작하십시오
  2. 과정이 끝날 때까지 기다립니다
  3. 프로세스에서 리턴 코드를 검색합니다

현재 다음 코드를 사용하고 있습니다.

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(PATH, ARGS, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    ::WaitForSingleObject(processInfo.hProcess, INFINITE);

    DWORD exit = 100;
    GetExitCodeProcess(processInfo.hProcess, &exit);

    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);

    return exit;
}

CreateProcess ()를 호출하면 IF 문의 신체에 성공하고 들어갑니다. WaitforsingleObject에 대한 호출은 즉시 반환됩니다. 프로세스는 완료하는 데 약 20-30 초가 걸리기 때문에 안됩니다. 그리고 마지막으로 getExitcodeProcess () 호출은 실패하고 "종료"값을 설정하지 않습니다.

참고로, 이것은 실제로 다른 곳에서 성공한 코드입니다.

서비스에서 시작되고 있으며 권한 문제가있을 수 있습니까 ??

편집하다: 나는 그것이 실제로 앱을 시작한다는 것을 깨달았지만 (Taskman에서 볼 수 있음) 붙어있는 것 같습니다. 거기에 있지만 아무것도하지 않습니다.
Rob Kennedy의 기반 제안, 프로세스 핸들 문제를 수정했는데 실제로 프로세스가 완료 될 때까지 기다립니다. 그러나 수동으로 죽이지 않으면 결코 끝나지 않습니다.

도움이 되었습니까?

해결책

WaitForSingleObject 그리고 GetExitCodeProcess 프로세스 핸들에 대한 포인터가 아니라 프로세스 핸들 자체를 기대하십시오. 앰퍼 샌드를 제거하십시오.

또한 반환 값을 확인하고 호출하십시오 GetLastError 그들이 실패했을 때. 미래의 문제를 진단하는 데 도움이됩니다. API 기능이 항상 성공할 것이라고 가정하지 마십시오.

함수를 올바르게 호출하고 새로운 프로세스가 시작되지만 진전이 없으면 합리적으로 확신 할 수 있습니다. 이것 코드는 범인이 아닙니다. 문제는 새로운 프로세스에 있으므로 서비스 프로세스가 아닌 디버깅 작업에 집중하십시오.

다른 팁

업데이트 및 편집 후에는 서비스에서 프로세스를 시작할 때 가능한 많은 Gotchas 중 하나처럼 들립니다. 외부 프로세스가 사용자 상호 작용을 기다리고있을 가능성이 있습니까? 내가 생각할 수있는 세 가지 주요 예가 있습니다. 예를 들어, 어떤 상황에서는 키보드 입력이 필요할 수있는 명령 줄 애플리케이션입니다 (예 : "CMD /C del *. *"는 사용자 확인이 필요합니다). 응용 프로그램에 창이 필요하고 표시되는 경우 다른 예제가 적용되지만 볼 수 없습니다. 이 경우 디버깅 중에 "데스크탑과 상호 작용"하도록 서비스를 설정 한 다음 응용 프로그램 창 (또는 DLL 또는 이와 유사한 것을 찾을 수없는 예기치 않은 Windows 오류 메시지를 볼 수 있습니다.

이것이 디버깅에 도움이된다면 보통 "a-ha!" 순간은 환경 변수, 경로, 현재 디렉토리 등과 같은 것들이 서비스 내에서 기대할 수있는 것이 아니라는 것을 깨닫는 것입니다. 권한은 이런 종류의 문제에 대한 가장 일반적인 이유가 아닙니다. 시작하려는 외부 응용 프로그램에 대한 세부 정보를 제공 할 수 있습니까?

콘솔 앱을 시작하므로 콘솔을 초기화하려는 숨겨진 시작 코드가있을 수 있습니다. 서비스가 데스크탑에 첨부되지 않으므로 서비스가 시작한 프로세스도 없으므로 콘솔을 만들 수 없습니다. 그것은 그것이 매달려있는 지점 일 수 있습니다.

가능하다면 프로세스를 전체 창 실행 파일로 변경하지만 창을 만들려고하는 부분을 건너 뛰십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top