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字段CInternetException而不是调用会发生GetLastError()什么?

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

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

于 2010-02-03T17:39:56.520 回答