Почему GetLastError() возвращает разные коды во время отладки и обычного выполнения?

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 не обнаруживаются при запуске программы вне отладчика? Нужно ли компилировать программу по-другому?

Любая помощь приветствуется. Спасибо.


person T.T.T.    schedule 03.02.2010    source источник


Ответы (1)


Моя память немного туманна в этом отношении, но что произойдет, если вы используете поле m_dwError объекта CInternetException вместо вызова GetLastError()?

Я предполагаю, что что-то вызывает сброс кода ошибки между фактической ошибкой и вашим вызовом GetLastError(). Я не знаю, почему это происходит при работе вне отладчика, но не внутри отладчика. Однако MFC кэширует код ошибки, вызвавший исключение в выброшенном объекте, поэтому вы должны иметь возможность использовать кэшированное значение независимо от того, какие вызовы API произошли с момента создания исключения.

GetErrorMessage() возвращает правильную строку ошибки, поскольку использует это поле m_dwError, а не вызывает GetLastError().

person Nick Meyer    schedule 03.02.2010
comment
m_dwError (msdn.microsoft.com/en-us/ library/29tbaeyz%28VS.80%29.aspx) будет работать. Спасибо. - person T.T.T.; 03.02.2010