0

Visual C++6.0を使用しています。Visual Studioインストールのサービスパックレベルはわかりませんが、OSはWin2KSP4です。失敗したコードはDLLの一部です。

コードは次のとおりです。

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、サービスパックのレベルはまだわかりません)、m_Client-> Connect()を呼び出すとエラーが返されるため、IFブロックに入ります。CAsyncSocket :: GetLastError()次に、デバッガーを開いて0xC0000005アクセス違反を報告します。私は、分解から何かを引き出すのに十分なこのことを理解していません。

CSocket :: GetLastError()とm_Client-> GetLastError()も試しましたが、同じ結果になりました。

開発システムに存在しない本番マシンにあるセキュリティポリシーが原因でm_Client->Connect()が失敗することはかなり確信していますが、実際のエラーコードを取得して、IT担当者が彼を絞り込むのを支援できるようにしたいと思います。探す。

ビルドシステムでGetLastError()を強制的に呼び出して、そこでアクセス違反が発生するかどうかを確認することはまだ試みていません。

4

1 に答える 1

1

メソッドはGetLastError()おそらくを呼び出しますWSAGetLastError()。しかし、WSAGetLastError()働くためには、WSACleanup()まだ呼ばれていないに違いありません。m_Clientあなたがそれを削除すると、まさにこれが起こると私は推測しています。オブジェクトGetLastError()を削除する前に呼び出してみてください。m_Client

于 2010-01-12T15:48:24.840 に答える