2013-09-27 2 views
2

이제 프로세스 A의 스레드 중 하나에 새로운 프로세스 B을 현재 스레드에 생성하고 프로세스 B의 함수 MyFunc()에서 실행해야합니다. 내가 어떻게 해 ? 현재 프로세스에서 하위 프로세스를 만드는 방법을 찾았습니다 : click. 그러나이 새로운 프로세스에서 MyFunc()을 어떻게 실행시킬 수 있습니까? 이 두 과정은 비동기를 실행하고이 예에서와 같이 서로 을 기다릴해야새 프로세스에서 함수를 실행하는 방법은 무엇입니까?

// Wait until child process exits. 
WaitForSingleObject(pi.hProcess, INFINITE); 

ETA를 : 나는 창

+1

그것은 당신이 Windows를 사용하는 링크에서 분명있을 수 있습니다,하지만 그건 정말 중요하다 질문의 일부이며, 당신이 그것을 분명하게 진술했는지 확인해야합니다. – BoBTFish

+0

이 자습서는 좋은 예입니다. http://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/ – Lainezor

답변

4

난 당신이 Windows에서 실행하는 가정에서 작동합니다. 두 개의 다른 프로세스가 완전히 별개의 주소 공간에서 실행됩니다. MyFunc (프로세스 1에서)에 대한 포인터를 다른 프로세스로 전달하려는 경우 실제로 수행 할 수 있지만 매우 어렵고 훨씬 쉬운 방법이 있습니다 (함수에서 볼 수있는 함수 자체를 가져와야 함). 두 프로세스 모두).

분명히 비동기 적으로 실행한다고해서 반환 된 값이 필요하지는 않습니다. 따라서 어떻게해야하는지 알 필요가있는 것은 다른 프로세스 (CreateProcess를 이미 알고 있음)와 실행 대상을 지정하는 것입니다. 두 번째 프로세스가 MyFunc를 실행하고 종료 한 실행 파일이면 CreateProcess를 사용하여 시작하고 lpCommandLine에 인수를 전달하고 완료 될 때 완료하도록합니다.

런타임에 알 수없는 임의의 함수를 실행하기 위해 다른 프로세스가 필요한 경우 사용 가능한 함수 집합을 DLL에 넣고 DLL 이름과 함수 이름을 두 번째 인수에 전달할 수 있습니다 프로세스 (lpCommandLine에서). 두 번째 프로세스는 LoadLibrary를 사용하여 DLL을로드하고 GetProcAddress를 사용하여 함수의 주소를 (이름으로) 가져옵니다.

일부 기능을 실행하는 데 다른 프로세스가 필요하고 위에서 설명한 명령 줄 인수를 지원하지 않으면 코드 삽입이라고하는 기술을 사용할 수 있습니다. 이것은 다른 프로세스에서 임의의 코드를 실행할 수있게 해주는 매우 진보 된 기술입니다. 이것이 필요한 경우이 대답에 어떻게 할 것인지 추가 할 것입니다. 그렇다면 의견을 게시하십시오.

다른 프로세스에서 고정 기능을 호출하는 데 필요한 주석을 읽은 후 다음을 추가했습니다. 여기

void MyFunc (TCHAR* argument) { 
    // Validate argument then do something with it... 
    } 

    int _tmain(int argc, _TCHAR* argv[]) 
    { 
    if (argc > 1) { 
     MyFunc(argv[1]); 
    } 
    return 0; 
    } 

(주 과정을 호출하는 방법은 다음과 같습니다 : 명령 줄에서 두 번째 인수로 인수 문자열을 넣어 (! 첫 번째 인수는 실행 파일을 포함하는 것을 잊지 마세요 환난이다) 나는이 생각 정확하지만 실제로 컴파일하고이 코드를 테스트하지 않았다 그것은 당신에게 일반적인 생각)을 얻었다 단지 의도 :.

STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    memset (&si, 0, sizeof(si)); 
    memset (&pi, 0, sizeof(pi)); 
    GetStartupInfo(&si); 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_USESHOWWINDOW; 

    TCHAR CommandLine[1024]; 
    // MyFuncArgument (type == TCHAR*, declaration not shown) is the single argument for MyFunc 
    // (put it in quotes if needed): 
    _stprintf(CommandLine, _T("DoMyFunc.exe %s"), MyFuncArgument); 
    if (CreateProcess (_T(".\\DoMyFunc.exe"), CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) != 0) { 
     _tprintf (_T("CreateProcess Succeeded\n")); 
     } 
    else { 
     _tprintf (_T("CreateProcess Failed\n")); 
     } 
+0

실제로'MyFunc()'는 단 하나의 인자 ('wchar_t []')만을 취하므로'CreateProcess'를 호출해야합니다. 이 인수를 lpCommandLine으로 전달하십시오. 하지만 내가 얻지 못한 것은 새로운 프로세스에서 어떻게 MyFunc()를 호출해야 하는가이다. 어디에서 구현해야합니까? 'MyFunc()'는 실행 전에 알려지며 항상 동일하게 유지됩니다. –

+0

이것은 가장 쉬운 시나리오입니다. MyFunc()가 포함 된 새로운 실행 프로그램 (DoMyFunc.exe와 같은)을 만듭니다. 프로그램은 argv []에서 인수를 가져온 다음 인수와 함께 MyFunc를 호출합니다. 일반적인 방법으로 CreateProcess를 사용하여 DoMyFunc를 시작합니다. –

관련 문제