2014-01-09 82 views
0

我想在功能MiniDumpWriteDump的窗口中创建一个转储。问题在于该函数将Handle写入文件以将结果写入。我想要内存中的数据,以便我可以通过互联网发送它。因此,我想知道是否有办法创建一个没有文件支持的句柄,我只需要一个指向数据的指针?我可以创建一个没有文件的句柄吗?

+0

你可以评论关于这个问题,而不是投票结束或downvote? – chacham15

+0

听起来像一个XY问题。将转储文件保存到临时文件然后发送文件有什么问题? – MSalters

回答

3

您可以使用内存映射文件。请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx

您需要传递hFile = INVALID_HANDLE_VALUE并指定文件的最大大小。请检查msdn了解详细信息。

+1

这似乎不太可能工作,并且当然不支持。文件映射句柄是为了传递给诸如'MapViewOfFile'之类的函数,它不是文件句柄的替代品。 –

+0

这完全是倒退。内存映射文件将文件映射到内存,以便代码可以像读/写内存一样操作,并且实际上会影响文件的内容。你想要的是相反的:一个让代码像读取/写入文件一样行为的句柄,但实际上它只影响内存。 –

0

故障转储确实是进程的内存。所以,这没有意义。你为什么不简单地发送文件并在成功发送后删除?

顺便说一句,您可以压缩文件并发送它,因为故障转储通常是大文件。

+0

我想从程序内部发送数据,因此我不想将数据写入文件,因为它只是浪费时间(生病必须反复阅读)+额外的麻烦,不必担心在哪里写文件。 – chacham15

2

有几种可能性。

一个会使用CreateFile,但通过FILE_ATTRIBUTE_TEMPORARY。这创建一个文件,但告诉Windows试图尽可能多地保留缓存中的文件。尽管这并不能完全避免创建文件,但如果您有足够的内存,它通常可以消除磁盘发生的任何(或多少)I/O。

另一种可能性(尽管我从未测试过)可能会将句柄传递给命名(或者甚至是匿名)管道。你通常可以像写文件一样写入管道,所以只要崩溃转储写入程序只需要能够将句柄传递给WriteFile,机会就会很好,这样可以很好地工作。从那里,你可以(例如)有另一个小程序从管道读取数据并将其写入套接字。显然,能够避免额外的处理从管道转换为套接字是很好的,但这样的生活有时候会是这样。

如果您还没有尝试过,那么您可能只需要将套接字句柄传递给崩溃转储书写器即可进行测试。虽然它有一定的限制,但Windows确实支持像普通文件(或其他)处理套接字句柄。当然,没有什么能够保证它能够工作,但无论如何它可能是值得的。

0

该文件说要传递一个文件句柄,所以如果你做了其他任何事情你违反合同,并且(如果它工作的话)行为将不可靠。

0

通过一个命名管道句柄。将数据传回给自己。

相关问题