2010-01-12 104 views
0

我正在使用Visual C++ 6.0。我不確定Visual Studio安裝的服務包級別,但操作系統是Win 2K SP4。失敗的代碼是DLL的一部分。VC++ 6.0:爲什麼CASyncSocket :: GetLastError()會導致訪問衝突?

下面的代碼:

EIO::OpenConnection() 
{ 
    m_Client = new CSocket(); 

    if(m_Client->Create() == 0) { 
     delete m_Client; 
     m_Client = NULL; 
     return CAsyncSocket::GetLastError(); 
    } 

    if (!m_Client->Connect((LPCTSTR)m_IPAddress, 7)) { 
     delete m_Client; 
     m_Client = NULL; 
     return CAsyncSocket::GetLastError(); 
    } 

    ...<stuff>... 
} 

此編譯沒有錯誤我的構建系統上,沒有任何的調用m_Client方法失敗的執行。當我將這個DLL移動到生產系統(Win 2K,尚不知道Service Pack級別)時,對m_Client-> Connect()的調用返回一個錯誤,所以它會進入IF塊。 CAsyncSocket :: GetLastError()然後調試器打開並報告0xC0000005訪問衝突。我不明白這個東西足以讓任何東西脫離反彙編。

我也嘗試過CSocket :: GetLastError()和m_Client-> GetLastError()以相同的結果。

我很確定m_Client-> Connect()失敗,因爲開發系統上缺少生產機器上的某些安全策略,但我想要獲取實際的錯誤代碼,以便我可以幫助IT人縮小了搜索範圍。

我還沒有嘗試在我的構建系統上強制調用GetLastError()以查看是否在那裏出現訪問衝突。

回答

1

GetLastError()方法很可能會調用WSAGetLastError()。 但WSAGetLastError()的工作,WSACleanup()一定還沒有被調用。 我猜測,當你刪除m_Client恰恰會發生這種情況。 在刪除m_Client對象之前,請嘗試調用GetLastError()

+0

謝謝,這個伎倆。在提交原始問題後,我開始懷疑這可能是我在開會時的問題。 – Andrew 2010-01-12 17:34:01

相關問題