제 응용 프로그램에서 하나의 exe를 시작하는 서비스가 하나 있습니다. 내가 VS 디버거가 EXE를 연결하고 휴식 할 때프로세스가 교착 상태 인 것으로 보입니다. 모든 스레드가 작동을 멈췄습니다.
BOOL bLaunched = false;
SHELLEXECUTEINFO ex;
memset(&ex, 0, sizeof(ex));
ex.cbSize = sizeof(ex);
ex.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
ex.hwnd = ::GetDesktopWindow();
ex.lpVerb = _T("open");
ex.lpParameters = params;
ex.lpDirectory = path;
ex.nShow = SW_SHOWNORMAL;
ex.lpFile = appName;
bLaunched = ShellExecuteEx(&ex);
return bLaunched;
ShellExecuteEx에 전화하면 내가 작업 관리자에서 그 EXE를 볼 수 있습니다 그것은 :로 서비스 코드에서
나는 ShellExecuteEx에 명령을 EXE를 실행하고 메시지 표시 "the process appears to be deadlocked(or is not running any user-mode code).All threads have been stopped"
VS 디버거는 winMain 기능에서 첫 번째 줄에 녹색 화살표가 표시되어 있습니다.
이것은 서비스에서 해당 exe를 시작하려고 할 때만 발생합니다. 동일한 매개 변수 세트를 사용하여 샘플 응용 프로그램에서 해당 exe를 실행하려고하면 정상적으로 작동합니다.
서비스의 경우 작동하지 않는 이유는 무엇입니까?
업데이트 : 나는 그것을 알아 냈다. 나는 exe에서 MessageBox를 호출했다. 나는 MessageBox를 제거하고 잘 실행했다. 창 관련 함수를 호출하면 문제가 발생한 것 같습니다. 실제로 로컬 시스템 계정에서 서비스가 실행 중이었고 해당 서비스에서 exe가 시작되었습니다. 로컬 시스템 계정에서 창 기능을 호출 할 수 없습니까?
나는 지금 당장 직면하고있다. exe에서는 값을 읽기 위해 레지스트리를 열 수 없다. HKCU를 열려고하는데 실패했다.
[MSDN 참조] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154%28v=vs.85%29.aspx)에 설명 된대로 COM을 초기화 했습니까? 그리고 당신은 [loader lock] (http://msdn.microsoft.com/en-us/library/dd744765%28VS.85%29.aspx)을 가지고 있지 않습니까? –
CreateProcess를 사용하여 시도한 결과 taskmanager에서 내 exe를 볼 수 있지만 다시 교착 상태가 됨으로 인해 그 이유가 확실하지 않습니다. – anand
데스크톱 창을 전달하는 것은 정말 좋은 생각이며 NULL을 전달합니다. 이미지 파일 실행 옵션 레지스트리 키가 있는지 미리 확인하십시오. –