Почему GetLastError () возвращает разные коды во время отладки против "нормального" выполнения? - PullRequest
1 голос
/ 03 февраля 2010
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 Ответ

4 голосов
/ 03 февраля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...