我可以创建没有文件的句柄吗?

时间:2014-01-09 21:39:18

标签: c++ c windows

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

有几种可能性。

一种方法是使用CreateFile,但通过FILE_ATTRIBUTE_TEMPORARY。此创建一个文件,但告诉Windows尝试尽可能多地保留缓存中的文件。虽然这并不能完全避免创建文件,但如果你有足够的内存,它通常可以消除任何(或许多,无论如何)进出磁盘的I / O.

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

如果您还没有尝试过,可能只想将套接字句柄传递给崩溃转储编​​写器进行测试。虽然它有点受限,但Windows确实支持将套接字句柄视为普通文件(或其他)句柄。肯定没有什么能保证它能够正常工作,但无论如何它都值得一试。

答案 2 :(得分:0)

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

顺便说一句,你可以压缩文件并发送它,因为crashdumps通常是大文件。

答案 3 :(得分:0)

文档说要传递一个文件句柄,所以如果你做了其他任何事情你就违反了合同(如果它完全有效),那么这种行为将是不可靠的。

答案 4 :(得分:0)

传递命名管道句柄。将数据传回给自己。