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/