现在我处于进程A
的一个线程中,我需要在当前线程中创建新进程B
,并在进程B
函数MyFunc()
中运行。我该怎么做 ?
我找到了如何从当前流程创建子流程:click。但是如何在这个新流程中运行MyFunc()
?这两个进程应该异步运行,而不是彼此等待
就像在这个例子中一样:
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
ETA: 我在windows上工作
答案 0 :(得分: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"));
}