2013-09-27 28 views
2

現在我處於進程A的其中一個線程中,我需要在當前線程中創建新進程B,並在進程B函數MyFunc()中運行。我該怎麼做 ? 我發現如何從當前進程創建子進程:click。但是我怎麼能在這個新的過程中運行MyFunc()?這兩個過程應該運行異步,而在本例中沒有等待對方 ,如:如何在新進程中運行一個函數?

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

ETA: 我在Windows

+1

這可能是從您使用的是Windows的鏈接很明顯,但是這是一個非常重要的問題的一部分,你應該確保你清楚地陳述。 – BoBTFish

+0

本教程有一個很好的例子。 http://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/ – Lainezor

回答

4

我假設你在Windows下運行工作。兩個不同的進程在完全獨立的地址空間中運行如果您正在考慮將指向MyFunc的指針(在進程1中)傳遞給另一個進程,這實際上可以完成,但這非常困難,並且有更簡單的方法(您必須將該函數本身存儲在內存中,兩個過程)。

顯然,你不需要返回值,因爲你說他們異步運行。所以你需要知道如何做的是啓動另一個進程(你已經知道這個--ProcessProcess)以及如何告訴它運行什麼。如果第二個進程是執行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。 –

相關問題