IPC 채널을 설정하기 위해 코드에서 프로세스를 시작하는 상황이 있습니다. 내가 시작하는 프로세스는 CLR을 지원하지 않는 MFC 애플리케이션이다. 이 프로세스를 시작하는 응용 프로그램은 WPF 응용 프로그램의 C# 모듈입니다 (내 문제가 필연적이라고 생각합니다). 이것은 CLR을 지원하는 응용 프로그램 버전에서 작동하며 Windows 7이 설치된 터치 스크린 컴퓨터 인 배포 대상을 제외한 모든 컴퓨터에서 작동합니다. 그러나 어떤 이유로이 정확한 시나리오로 시도 할 때 Process 개체는 절대로 사용하지 마십시오. 주 창 핸들 (Process.MainWindowHandle
)을 해결합니다. 이 작업을 수행하는 또 다른 방법이 있을까요? 보안 문제인가요? 나는 그 과정을 응시하는 사람이다. 프로세스의 주 창 핸들이 존재합니다. 나는 무엇이 잘못 될지 모른다.시작한 프로세스의 주 창 핸들을 가져올 수없는 이유는 무엇입니까?
도움이된다면 여기에 내 코드가 있습니다.
_applicationProcess = new Process();
_applicationProcess.StartInfo.FileName = _strProcessPath;
_applicationProcess.StartInfo.Arguments = _strProcessArguments;
_applicationProcess.Start();
long nTicks = Environment.TickCount;
if (_applicationProcess.WaitForInputIdle(1 /*minute(s)*/ * 60000))
{
try
{
do
{
// Don't let total processing take more than 1 minute(s).
if (Environment.TickCount > nTicks + 1 /*minute(s)*/ * 60000)
throw new ApplicationException("MFCApplication.Startup failed! The main window handle is zero!");
_applicationProcess.Refresh();
}
while (_applicationProcess.MainWindowHandle.ToInt32() == 0);
_applicationHandle = new IntPtr(_applicationProcess.MainWindowHandle.ToInt32());
}
catch (Exception ex)
{
//Do some stuff...
throw;
}
}
else
{
// Do exception handling.
}
ApplicationException
는 0 이외의 메인 윈도우 핸들을 얻으려고 노력하는 분 후 공격한다.
MSDN 문서에서 제안하는대로 'WaitForInputIdle'을 사용하여 지치셨습니까? 또한'throw ex' 대신'throw'를 사용하는 것이 가장 좋습니다. 'throw ex' ('throw ex'는 예외를 throw하고 스택 트레이스를 다시 시작합니다)와 함께 스택 추적 정보를 잃게됩니다. –
편집 내용을 확인하십시오. :) – Jordan
@ jordan 나는 당신의 편집을 본다. @username을 주석에 포함 시켜서 응답하는 다른 사용자에게 통지해야합니다. –