将文本从子GUI进程发送到控制台父进程的最简单方法是什么?

时间:2013-03-15 07:11:33

标签: c++ windows winapi console-application

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

最简单的方法是什么?

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

4 个答案:

答案 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));

这种方法相当简单,也很强大。