2014-01-31 4 views
0

제 응용 프로그램에서 하나의 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를 열려고하는데 실패했다.

+1

[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)을 가지고 있지 않습니까? –

+0

CreateProcess를 사용하여 시도한 결과 taskmanager에서 내 exe를 볼 수 있지만 다시 교착 상태가 됨으로 인해 그 이유가 확실하지 않습니다. – anand

+1

데스크톱 창을 전달하는 것은 정말 좋은 생각이며 NULL을 전달합니다. 이미지 파일 실행 옵션 레지스트리 키가 있는지 미리 확인하십시오. –

답변

1

바탕 화면과 상호 작용하는 실행 파일을 시작하려고합니다. 서비스는 비대화 형 세션 인 세션 0에서 실행됩니다. 해당 세션에서 시작하는 모든 프로세스가 데스크톱과 상호 작용하지 않는지 확인해야합니다.

데스크톱 창을 소유자 창으로 넘겨서는 안됩니다. http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx.

+0

그 이유는 그 exe는 레지스트리를 열 수 없습니다. 나는 시스템 계정에서 실행되는 서비스가 높은 수준의 권한을 가지고 있으며 서비스로 실행되는 exe가 모든 것을 할 수 있어야한다고 기대하고 있습니다. – anand

+0

프로세스가 레지스트리를 열 수 있지만 LocalSystem으로 실행중인 프로세스에 대해'HKCU'에서 어떤 값을 찾을 것으로 예상하십니까? 나는 실제로 로그온 한 사용자의 레지스트리를 원한다고 생각합니다. 그러나 LocalSystem으로 실행중인 서비스에서 찾기가 어렵습니다. Btw, 왜 LocalSystem을 사용하기로 선택 했습니까? 당신은 그렇게하지 않아도됩니다. –