C++ MiniTumpWriteUp()放入命名管道,然后读取文件()

C++ MiniTumpWriteUp()放入命名管道,然后读取文件(),c++,winapi,named-pipes,minidumpwritedump,C++,Winapi,Named Pipes,Minidumpwritedump,我想做的是使用minidumpWriteUp()写入命名管道,然后自己读/写。如果直接将内容写入文件,则可以成功执行转储。但是,虽然已成功写入命名管道,但后续的读/写操作并不顺利。我可以从管道中读取所有数据,但在写入数据时,DMP文件似乎已损坏 以下是ReadFile()逻辑: 以下是WriteFile()逻辑: 我不确定它是否适用于根本原因,但以下是命名管道设置: HANDLE hInboundPipe = CreateNamedPipe( szPipeName, PI

我想做的是使用minidumpWriteUp()写入命名管道,然后自己读/写。如果直接将内容写入文件,则可以成功执行转储。但是,虽然已成功写入命名管道,但后续的读/写操作并不顺利。我可以从管道中读取所有数据,但在写入数据时,DMP文件似乎已损坏

以下是ReadFile()逻辑:

以下是WriteFile()逻辑:

我不确定它是否适用于根本原因,但以下是命名管道设置:

    HANDLE hInboundPipe = CreateNamedPipe(
    szPipeName,
    PIPE_ACCESS_DUPLEX,
    PIPE_WAIT | PIPE_TYPE_BYTE,
    PIPE_UNLIMITED_INSTANCES,
    0,
    0,
    (DWORD)-1,
    &SecAttrib);
GetLastError()没有报告任何错误。我错过了什么明显的东西吗

编辑:添加MiniTumpWriteDomainp()如何响应注释

HANDLE hDump = CreateFile(szPipeName, GENERIC_ALL, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
MiniDumpWriteDump(hProcess, pid, hDump, mdValue, NULL, NULL, NULL);
CloseHandle(hDump);
更新:
我的印象是,按块阅读某种程度上是在丢弃数据。为了测试这一点,我增加了命名管道的缓冲区,以适应整个转储,而无需调整大小。我还增加了
vecBuffer
大小以匹配。现在,当执行
ReadFile()
操作时,我接收到整个转储,但它仍处于关闭状态。我仍在使用各种命名管道设置,试图找出需要执行哪些操作才能获得
MiniDumpWriteDump()
,以便为命名管道提供有效的输出。

这似乎无法完成。有关更多信息,请参阅注释。无法从
minidumpWriteDomainp()
直接写入命名管道,因为传入的句柄必须具有查找功能。命名管道没有该功能,因此您必须使用合法的文件句柄。

您是否在读取转储文件的另一个线程上写入转储文件?因为管道可能已满,并等待有人读取数据。@user253751是。我正在启动两个不同的线程。一个用于minidumpWriteUp(),另一个用于读/写操作。如何声明
vecBuffer
sizeof(char)
根据定义始终为1,因此在调整大小行上是多余的,因此该缓冲区的类型可能存在混淆
std::vectorbuffer(iBuffer)。作为故障排除过程的一部分,我在中添加了
sizeof(char)
代码,并将根据您的建议将其删除。在以前的一些测试中,我将
vecBuffer
设置得足够大,以避免需要调整其大小。无论是否调整
vecBuffer
,都会出现此问题。您如何验证输出是否确实无效
MinidumpWriteUp
非常灵活,可以生成Visual Studio无法成功打开的转储。如果发生这种情况,请使用WinDbg。
    HANDLE hInboundPipe = CreateNamedPipe(
    szPipeName,
    PIPE_ACCESS_DUPLEX,
    PIPE_WAIT | PIPE_TYPE_BYTE,
    PIPE_UNLIMITED_INSTANCES,
    0,
    0,
    (DWORD)-1,
    &SecAttrib);
HANDLE hDump = CreateFile(szPipeName, GENERIC_ALL, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
MiniDumpWriteDump(hProcess, pid, hDump, mdValue, NULL, NULL, NULL);
CloseHandle(hDump);