1
try
{      

    pConnect = sess->GetFtpConnection(ftpArgs.host, ftpArgs.userName, ftpArgs.password, port, FALSE );
}
catch (CInternetException* pEx) 
{
    loginErrCode = GetLastError();
    printf("loginErrCode: %d\n", loginErrCode);

    if(loginErrCode == 12013)
    {
        printf("Incorrect user name!\n");
        exit(0);
    }
    else if(loginErrCode == 12014)
    {
        printf("Incorrect password!\n");
        exit(0);
    }
    else if(loginErrCode == 12007)
    {
        printf("Incorrect server name!\n");
        exit(0);
    }
    else //display all other errors
    {   
        TCHAR sz[1024];
        pEx->GetErrorMessage(sz, 1024);
        printf("ERROR!  %s\n, sz);
        pEx->Delete();
        exit(0);
    }  

このコードを Visual Studio から意図的に間違ったユーザー名で実行すると、GetLastError() は 12014 (予期される) を返します。

ただし、コマンド ラインから同じコードを実行すると (まったく同じユーザー名が正しくない場合)、GetLastError() は 2 を返します。( GetErrorMessage()は正しくないパスワードを返します)

違いがわかりません。

さらに、Visual Studio でプロセスをアタッチしながらコマンド ラインからプログラムを実行し、デバッグしました。12014を受け取りました。

デバッガーが関与している場合は常に 12014 が返されます。実行可能ファイルを同じパラメーターで「通常どおり」実行すると、2 が返されます。

デバッガーの外部でプログラムを実行すると、WinInet エラー コードが見つかりませんか? プログラムを別の方法でコンパイルする必要がありますか?

どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

4

この点については少し記憶が曖昧ですが、を呼び出す代わりにオブジェクトのm_dwErrorフィールドを使用するとどうなるでしょうか?CInternetExceptionGetLastError()

私の推測では、実際のエラーとGetLastError(). デバッガーの外部で実行しているが、デバッガーの内部では実行していないときに、なぜこれが発生するのかわかりません。ただし、MFC はスローされたオブジェクトで例外の原因となったエラー コードをキャッシュするため、例外がスローされた後に発生した API 呼び出しに関係なく、キャッシュされた値を使用できるはずです。

GetErrorMessage()m_dwErrorは、を呼び出すのではなくこのフィールドを使用するため、正しいエラー文字列を返しますGetLastError()

于 2010-02-03T17:39:56.520 に答える