2009-02-16 224 views
0

我的應用程序可以在串行和套接字連接之間切換,但兩者都不能同時打開。所以當我嘗試在Socket與Serial之間切換時,我刪除了Socket連接。基於套接字的對象使用一個名爲UsesWinsock的私人類(這裏大聲喊出Len Holgate,因爲它基本上是他的代碼(實際上是RAII,但是直到我看到他這樣做,我纔將它應用到WSA))。這只是簡單地調用WSAStart和WSACleanUp。WSACleanUp導致異常

當WSACleanUp被調用時,它會進入NTDLL和彙編程序。 @ err,hr給了我「傳遞給系統調用的數據區域太小」與HRESULT相同。

我試着移動代碼:按繼承順序移動類會導致破壞序列發生變化,並且實際上破壞了函數,因此它們是在破壞序列中調用的最後一個東西。都沒有工作。

我很確定我已經釋放了所有分配的東西(只有一個套接字和幾個事件),我被卡住了 - 這對我來說是一個相當重要的問題。

Google is unhelpful returning 4 results of which none solve my problem

有什麼建議嗎?

回答

1

那麼,你使用我的UsesWinsock類嗎?那是,你是說它壞了嗎?如果是這樣的直接發給我的電子郵件可能是解決問題的更有效的方式;)

我注意到我的代碼實際上並沒有檢查來自dtor中WSACleanUp()的返回代碼,所以我假設你正在檢查這個,它是SOCKET-ERROR並且WSAGetLastError()報告了ERROR-INSUFFICIENT-BUFFER?

+0

我沒有像現在這樣使用你的課程,但它確實看起來很可疑。這裏有一個關於使用外部代碼的恐懼症,所以我不得不重寫它。但是,一旦這個想法被播下,你怎麼能不播下它? 實際的HRESULT錯誤在監視窗口中顯示爲@ err,hr。 CleanUp從來沒有真正返回。 – 2009-02-16 12:04:29

+0

奇怪。我從來沒有見過這種情況發生。在這次調用發生之前還有其他的事情正在卸載winsock dll嗎?你還有其他的調用WSAStartup和WSACleanUp嗎?什麼是演示問題的最小示例程序; etc ... – 2009-02-16 12:44:39

0

我很想知道,如果你使用的重量 你會發現什麼「跟蹤,看數據」窗口中的調試器命令:

設置在WSACleanup開始時的斷點:

 
bp ws2_32!wsacleanup 

一旦擊中,發出trace命令:

 
wt -oa -oR @$ra 

並觀看了呼叫NTDLL RtlSetLastWin32Error !你也可以在這裏發佈調查結果,看看它們會很有趣。