为什么GetLastError()在调试与“正常”执行期间返回不同的代码?

时间:2010-02-03 17:35:08

标签: c++ windows visual-studio wininet

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错误代码?我需要以不同方式编译程序吗?

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:4)

我的记忆在这方面有点模糊,但是如果您使用m_dwError对象的CInternetException字段而不是调用GetLastError()会发生什么?

我的猜测是,有些事情导致错误代码在实际错误和您对GetLastError()的调用之间重置。我不知道为什么在调试器外部运行而不是在调试器内运行时会发生这种情况。但是,MFC缓存导致抛出对象中的异常的错误代码,因此无论自抛出异常以来发生了什么API调用,您都应该能够使用缓存值。

GetErrorMessage()会返回正确的错误字符串,因为它会使用此m_dwError字段,而不是调用GetLastError()