我用C ++编写了两个进程。一个是我的控制台应用程序使用CreateProcess
API调用的GUI过程。我需要将文本从GUI应用程序(子)传递到控制台应用程序(父级)。文本的数量可以是任意的 - 从几行到KB的文本。
最简单的方法是什么?
PS。我可以访问这两个进程的源代码。
答案 0 :(得分:3)
控制台应用程序可以创建一个WinAPI窗口(不可见),这样它就可以接收消息(从Delphi中的AllocateHWND函数中获取的想法)。
另一种解决方案是使用命名管道。
另一种解决方案是通过TCP / IP在本地发送数据。
如果这些字符串只是调试字符串,请考虑使用WinAPI中的OutputDebugString函数并使用SysInternals'DbgView之类的程序捕获它们。
答案 1 :(得分:1)
简单的方法可能是让孩子实际上成为一个控制台应用程序,即使它也创建了窗口。
在这种情况下,您可以让父母使用_popen
生成孩子,孩子可以将输出写入正常stdout
/ std::cout
。 _popen
返回一个FILE *
,因此父级可以读取孩子的输出,就像它通常读取文件一样(好吧,通常是C语言)。
答案 2 :(得分:1)
如果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编程,所以在某些细节上可能会出错。但是,希望能够让你开始。
当然还有许多其他方法Inter Process Communications (IPC),包括(但不限于)套接字,文件,共享内存等。
答案 3 :(得分:1)
可以使用各种方法,其中一些方法如上所述。哪个最简单取决于你的任务
我还建议你在IPC中广泛使用的文件映射技术,例如。 dll使用filemapping实现
它允许 mutliply进程同时共享相同的资源,访问是随机的而不是后果。
以下是实施的主要步骤:
1。进程A创建文件;
2. 进程A为文件创建一个命名系统对象mappedfile(mappedfile分配内存);
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));
这种方法相当简单,也很强大。