2010-07-02 4 views
1

메모장과 같은 다른 프로그램을 스레드로 실행하여 내 프로그램과 동일한 메모리 공간을 공유하는 방법이 있습니까? 그래서 내 프로그램이 끝나면 메모장도 열리므로 메모장은 내 프로그램 인 작업 관리자에 표시되지 않습니까?프로그램을 스레드가 아닌 프로세스로 실행

답변

2

아니오, 확실히 메모장과 같이 관리되지 않는 앱에는 해당되지 않습니다.

그러나 관리되는 응용 프로그램의 경우 System.Reflection에있는 유틸리티를 사용하여 어셈블리를로드하고 Main() 메서드 (또는 엔트리 포인트가 아니라)의 실행을 시작할 수 있습니다.

그러나 사용자가 원하는 것을 에뮬레이트 할 수있는 몇 가지 기능이 System.Process 클래스에 있습니다.

1

아니요. 이것은 모든 종류의 불쾌한 일이 발생할 가능성이 있으므로 매우 나쁜 생각입니다. 다른 프로그램은 초기화해야 할 내용과 호스팅 프로그램에 의해 초기화 된 내용을 알 수있는 방법이 없습니다.

그러나 프로그램에서 메모장을 강제로 닫을 수는 있습니다. 응용 프로그램이 종료 될 때 생성 한 프로세스에서 Process.CloseMainWindow (nice) 또는 Process.Kill (dead this to) 메서드를 호출하면됩니다.

0

아니,이 (단일 프로세스 내에서 몇 가지 이상한, 가상화 스타일의 환경을하려고 금지.)

, 그 메모장 앱으로 사망 확인 작업 개체를 생성에 응용 프로그램을 할당 할 수 없습니다 그것이 메모장을 시작하기 전에. 프로그램이 닫히면 작업 개체가 삭제되고 작업 개체의 모든 하위 프로세스도 닫힙니다.

2

이론적으로 OS 로더와 동일한 작업을 수행 할 수 있습니다. 실행 파일을로드하고 기본 진입 점을 찾고 스레드에서 호출합니다.

모든 종류의 app-compat 문제로 실행될 가능성이 높습니다. 실행 파일의 코드가 이러한 방식으로 실행될 것으로 예상하지 않기 때문입니다.

+2

많은 경우에는 작동하지 않습니다. 분할해야 할 프로세스 정보가 많이 있습니다. GetModuleHandle (NULL) 또는 GetCommandLine()을 호출하는 것만 큼 간단한 결과라도 잘못된 결과가 반환됩니다. – Michael

+0

실행 파일로드 및 실행 _will_ work. 내가 말했듯이, 정의되지 않은 _after_가 발생합니다. :-) –

+1

당신은 흥미로운 작업 정의가 있습니다 :) 그것은 프로그램의 진입 점에도 미치지 못합니다 - 소스 코드 WinMainCrtStartup 또는 __mainCRTSTtrtup을보십시오. 많은 API 호출이 올바르게 작동하지 않습니다. – Michael

관련 문제