2014-01-09 81 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

通過一個命名管道句柄。將數據傳回給自己。

相關問題