从儿童GUI过程发送文本到控制台父母的最简单方法是什么?

我用C ++编写了两个进程。 一个是我的控制台应用程序使用CreateProcess API调用的GUI过程。 我需要从GUI应用程序(子)传递文本到控制台应用程序(父)。文本的数量可以是任意的 – 从几行到文本的KB。

什么是最简单的方法呢?

PS。 我可以访问这两个进程的源代码。

如果GUI应用程序只是真正的图形化,那么您并不真正使用标准输出流(即std::cout )。 这可以重复使用输出到您的控制台应用程序。

首先,您需要使用CreatePipe创建一个匿名管道:

 HANDLE hPipeRead; HANDLE hPipeWrite; CreatePipe(&hPipeRead, &hPipeWrite, NULL, 0); 

现在你必须处理可以用作普通的文件句柄; 一个读取,另一个写入。 写入句柄应该设置为您创建的新过程的标准输出:

 STARTUPINFO startupInfo = { 0 }; startupInfo.cb = sizeof(startupInfo); startupInfo.dwFlags = STARTF_USESTDHANDLES; startupInfo.hStdOutput = hPipeWrite; // Standard output of the new process // is set to the write end of the pipe CreateProcess( lpApplicationName, lpCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, // Use our startup information &processInfo); 

现在每当子进程需要写入父进程,它只需要使用标准输出:

 std::cout << "In child process, are you getting this parent?"; 

父级使用ReadFile从管道的读端读取:

 char buffer[256]; DWORD bytesRead = 0; ReadFile(hPipeRead, buffer, sizeof(buffer), &bytesRead, NULL); 

注意:我有一段时间没有做WIN32编程,所以在一些细节上可能会出错。 但是,希望足以让你开始。


如果进程间通信(IPC)包括(但不限于)套接字,文件,共享内存等,当然还有很多其他的方法。

控制台应用程序可以创建一个WinAPI窗口(不可见),以便它可以接收消息(从Delphi中的AllocateHWND函数获取的想法)。

另一个解决方案是使用命名管道。

另一个解决方案是通过TCP / IP在本地发送数据。

如果这些字符串只是一个调试字符串,请考虑使用WinAPI中的OutputDebugString函数,并使用像SysInternals的DbgView这样的程序来捕获它们。

简单的方法可能是让孩子实际上是一个控制台应用程序,即使它也创建窗口。

在这种情况下,你可以使用_popen让你的父母产生孩子,孩子可以把输出写到正常的stdout / std::cout_popen返回一个FILE * ,所以父母可以像读取文件一样读取孩子的输出(好吧,通常也是C)。

可以使用各种方法,其中一些是上面给出的。 哪一个最简单取决于你的任务。
我也可以建议你在IPC中广泛使用的filemapping技术 , DLL是使用filemapping实现的。
它允许多个进程同时共享相同的资源 ,访问是随机的而不是必然的。
以下是实施的主要步骤:

1.进程A创建一个文件;
2.进程A为文件创建一个命名的系统对象映射文件(映射文件分配内存);
3.进程A为系统对象创建一个viewOfMapped文件(这允许将进程A的某个区域映射到主内存中由mappedFile分配的页面);
4.进程B创建命名的系统对象mappedfile(名称应该类似于使用的进程A的名称),viewOfMapped文件;
5.由viewOfMapped进程返回的指针可以共享相同的内存。 例:
过程A:

 /* 1. file creation */ hFile = CreateFile(0, GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); /* 2. Create file mapping */ wchar_t lpName[] = L"fileMappingObject0"; HANDLE hfileMappingObject; hfileMappingObject = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 1024, lpName); /* 3. Create MappedFileViewOfFile */ void* p = (MapViewOfFile(hfileMappingObject, FILE_MAP_ALL_ACCESS, 0, 0, 0)); 

过程B:

 /* 2. Create file mapping */ wchar_t lpName[] = L"fileMappingObject0"; HANDLE hfileMappingObject; hfileMappingObject = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 1024, lpName); /* 3. Create MappedFileViewOfFile */ void* p = (MapViewOfFile(hfileMappingObject, FILE_MAP_ALL_ACCESS, 0, 0, 0)); 

这种方法相当简单,而且功能强大。