我假設你在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"));
}
這可能是從您使用的是Windows的鏈接很明顯,但是這是一個非常重要的問題的一部分,你應該確保你清楚地陳述。 – BoBTFish
本教程有一個很好的例子。 http://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/ – Lainezor