gpt4 book ai didi

c++ - 如何在新进程中运行一个函数?

转载 作者:可可西里 更新时间:2023-11-01 14:50:33 27 4
gpt4 key购买 nike

现在我在进程的线程之一 A ,我需要创建新进程 B在当前线程中,并在进程中运行 B函数 MyFunc() .我该怎么做 ?我找到了如何从当前进程创建子进程:click .但是我怎样才能运行 MyFunc()在这个新过程中?这两个进程应该异步运行,而不是互相等待就像这个例子:

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

预计到达时间:我在 Windows 上工作

最佳答案

我假设您在 Windows 下运行。两个不同的进程在完全独立的地址空间中运行。如果您正在考虑将指向 MyFunc(在进程 1 中)的指针传递给另一个进程,这实际上可以完成,但它非常困难并且有更简单的方法(您必须在内存中获取函数本身是可见的)两个过程)。

显然,您不需要返回值,因为您说它们是异步运行的。因此,您需要知道如何启动另一个进程(您已经知道这个——CreateProcess)以及如何告诉它运行什么。如果第二个进程是一个执行 MyFunc 然后退出的可执行文件,那么只需使用 CreateProcess 启动它,在 lpCommandLine 中传递任何参数并在它完成时让它完成。

如果您需要其他进程运行一些任意函数(直到运行时才知道),您可以将可用函数集放入一个 DLL 并将 DLL 的名称和函数的名称传递给第二个进程(在 lpCommandLine 中)。然后,第二个进程使用 LoadLibrary 加载 DLL,并使用 GetProcAddress 获取函数地址(按名称)。

如果您需要其他进程运行某些功能并且它不支持上述命令行参数,那么您可以使用一种称为代码注入(inject)的技术。这是一项非常先进的技术,可以让您在另一个进程中运行任意代码。如果这是您的需要,我会将如何做附加到这个答案。如果是,请发表评论。

我在阅读您的评论后添加了以下内容,您需要在其他进程中调用固定函数。将参数字符串放入命令行的第二个参数中(第一个参数是可执行文件的名称——不要忘记包含它!):

    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"));
}

关于c++ - 如何在新进程中运行一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19051248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com