如何在新进程中运行函数?

2024-02-03

现在我处于进程的线程之一A,我需要创建新流程B在当前线程中,并在进程中运行B功能MyFunc()。我该怎么做 ? 我找到了如何从当前进程创建子进程:click http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx。但我怎么跑MyFunc()在这个新过程中?这两个进程应该异步运行,而不是互相等待 就像这个例子一样:

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

ETA:我在窗户上工作


我假设你在 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"));
       }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在新进程中运行函数? 的相关文章

随机推荐