c++ - 为什么 GetLastError() 在调试期间与 "normal"执行期间返回不同的代码?

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

感谢任何帮助。谢谢。

最佳答案

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

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

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

关于c++ - 为什么 GetLastError() 在调试期间与 "normal"执行期间返回不同的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2193977/

相关文章:

检查当前用户是否可以写入注册表(C,windows)

.net - 您能否将一段代码标记为仅包含在调试版本中?

c++ - 通过 list 通过 DLL 重定向加载 DLL 文件两次

c++ - 如何强制 Visual Studio 2008 警告缺少头文件

c++ - 如何按列复制 vector ?

c++ - 从一个数组到另一个数组的选择性浅拷贝

c++ - 如何使用Mingw编译Linux程序?

windows - 注册表拦截的替代方案

visual-studio - 为什么我的 Visual Studio 2019 Pro 在执行 Visual Installer 更新后调试如此缓慢?

c++ - 没有返回语句但编译并返回正确答案的函数