草庐IT

c - GetLastError()、errno、FormatMessageA() 和 strerror_s()?

coder 2023-11-09 原文

我对 GetLastError()errno 之间的确切关系感到困惑。它们是相同的数值,还是完全不同的东西?我怎么知道我应该检查哪一个?

如果我想将错误代码转换为字符串进行调试,我可以将 FormatMessageA()strerror_s() 互换使用吗?

最后,WSAGetLastError() 是否总是返回与 GetLastError() 相同的值,还是它们都返回不同的值?

最佳答案

GetLastError 和errno 没有关系。

GetLastError 获取由 Windows API 函数(针对当前线程)设置的最后一个错误,而 errno 包含由 C 运行时库函数(也针对当前线程)存储到其中的最后一个错误。

几乎所有将错误返回给调用者的 WinAPI 函数都会以某种方式指示错误发生的时间,然后设置调用者通过调用 GetLastError 获取的错误。 注意:并非所有 WinAPI 函数都会向其调用者返回错误。

例如,WinAPI 函数 CreateFile 的文档说:

如果函数成功,返回值是指定文件、设备、命名管道或邮槽的打开句柄。如果函数失败,返回值为 INVALID_HANDLE_VALUE。要获取扩展的错误信息,请调用 GetLastError。

将错误返回给调用者的 C 运行时库函数将以某种方式指示何时发生错误,然后将值存储在 errno 中。 注意:并非所有 C 运行时库函数都会向其调用者返回错误。

例如,C 运行时库函数 sqrt 的文档说:

sqrt 函数计算其参数的非负平方根。如果其参数为负,则会发生域错误。

有关域错误的文档说:

在出现域错误时,该函数返回一个实现定义的值;值 EDOM 存储在 errno 中。

GetLastError 返回的值与存储在 errno 中的值不同,所以我认为这回答了有关使用 FormatMessage 和 strerror_s 的问题。

我不知道 WSAGetLastError 是否总是返回与 GetLastError 相同的值(尽管我注意到 GetLastError 返回的错误代码列表确实包括 WSAGetLastError 可以返回的错误代码)。参见 System Error Codes (9000-11999) .如果您查看从 10000 左右开始的错误代码,您将看到 WSAGetLastError 错误代码。

无论如何,我个人不会依赖它们返回相同的值。为什么那会有用?只需按照文档并为 Winsock2 函数调用 WSAGetLastError,为其他 WinAPI 函数调用 GetLastError。注意:您可以对任一函数返回的错误代码使用 FormatMessage。

关于c - GetLastError()、errno、FormatMessageA() 和 strerror_s()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20056851/

有关c - GetLastError()、errno、FormatMessageA() 和 strerror_s()?的更多相关文章

  1. ruby-on-rails - Ruby on Rails 从 'Errno::ENOENT' 中解救出来 - 2

    我需要从RubyonRails3.0.4应用程序中的“Errno::ENOENT”中解救出来。我目前有包含以下代码的Controller:begin`lame#{parameters}`rescueErrno::ENOENTlogger.info"command'lame'notfound:ensureLAMEisinstalled"end然而,从未调用日志代码,但日志显示:script/rails:Nosuchfileordirectory-lame...如果我用相同的片段创建一个ruby​​脚本,异常就会被挽救。 最佳答案 在R

  2. ruby - Sass: errno::enoent: 没有那个文件或目录 - 2

    我知道这是一个非常平淡的错误,但我在Sass3.4.2中遇到了一个常规的“找不到文件”错误:/*Errno::ENOENT:Nosuchfileordirectory-dumdum.scssBacktrace:/Library/Ruby/Gems/2.0.0/gems/sass-3.4.12/lib/sass/plugin/compiler.rb:482:in`read'/Library/Ruby/Gems/2.0.0/gems/sass-3.4.12/lib/sass/plugin/compiler.rb:482:in`update_stylesheet'/Library/Ruby/

  3. ruby-on-rails - Errno::ENOENT - 没有这样的文件或目录@rb_sysopen - 2

    我正在尝试使用ruby​​onrails中的actionmailer发送电子邮件附件,但我一直收到此错误。问题似乎是它无法在我指定的目录中找到文件,但文件路径是有效的。我还在控制台中使用File.exist?检查了这一点,并确认提供的路径计算结果为真。这是我的邮件:classOrderMailer我还按照ActionMailer文档的建议安装了邮件gem来处理编码。任何帮助将不胜感激,-布莱恩 最佳答案 Rails.root返回一个Pathname对象。Pathname#+(string)将File.joinstring到路径ifi

  4. ruby-on-rails - 为什么我在 Rails 中得到 "Errno::ECONNREFUSED"和 'net/http'? - 2

    我正在尝试从URL解析XML文件。当我尝试这样的事情时:require'net/http'require'rubygems'require'xmlsimple'url='http://my-address.com/xmltest/note.xml'xml_data=Net::HTTP.get_response(URI.parse(url)).body一切正常,但仅当我在Rails项目之外执行此操作时。如果我尝试将此文件包含在我的Rails3项目中并在那里解析它,我会收到错误消息"Errno::ECONNREFUSEDin[controller]"-Connectionrefused-c

  5. ruby-on-rails - Errno::EACCES:权限被拒绝@dir_s_mkdir - 2

    我是Ruby的新手..正在按照TeamTreehouse上的说明在OSX(Yosemite)上安装Ruby开发环境。当我到达创建测试应用程序的步骤时。它最终失败了。权限被拒绝。:(不确定我做错了什么,我确实尝试运行geminstalldebuginspector和bundleexecspringbinstubball但它们都失败了。[]railsnewtestappcreatecreateREADME.rdoccreateRakefilecreateconfig.rucreate.gitignorecreateGemfilecreateappcreateapp/assets/javas

  6. ruby-on-rails - Ruby omniauth-oauth2 - A Errno::ENETUNREACH - 网络无法访问 - 连接(2) - 2

    当用户尝试使用facebook登录时,我的Rails应用程序有时(大约2周后)在回调方法期间崩溃。这是随机发生的,我找不到解决这个问题的方法。下面是错误和一段堆栈跟踪:Errno::ENETUNREACH发生在#:网络无法访问-connect(2)REQUEST_METHOD:获取REQUEST_PATH:/auth/facebook/callbackREQUEST_URI:/auth/facebook/callback?code=AQDoUnHaO4ShfZUtCw6TVHAd_oOWUQ7Lar-OunhlFHoWhpTmiliY8hWTEb0CmufEMABpUggIlAe15j

  7. ruby - SSL_connect returned=1 errno=0 state=SSLv3 read server hello A: 版本号错误 (OpenSSL::SSL::SSLError) - 2

    当我运行https.ssl_version=:TLSv1_2我得到了错误ruby/2.1.0/net/http.rb:920:in`connect':SSL_connectreturned=1errno=0state=SSLv3readserverhelloA:wrongversionnumber(OpenSSL::SSL::SSLError)当我更改为https.ssl_version=:SSLv3ruby/2.1.0/net/http.rb:920:in`connect':SSL_connectSYSCALLreturned=5errno=0state=SSLv3readserve

  8. ruby-on-rails - 无法分配请求的地址 - bind(2) (Errno::EADDRNOTAVAIL) - 2

    我在centos6.3服务器上使用railforteambox,实际上这只是在实际应用之前的试错。我正在使用2个运行在相同centos版本和精确副本上的虚拟机,VM2只运行远离VM1的mysql我试过mysql连接#nc并且它已连接VM1(192.168.7.201)&VM2(192.168.7.202运行MYSQL)我在my.cnf中的远程机器(VM2)上有bind-address,bind-address=192.168.7.202这是我的database.ymldevelopment:adapter:mysqlhost:192.168.7.202port:3306username

  9. ruby-on-rails - SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 读取服务器 hello A - Faraday::Error::ConnectionFailed - 2

    我在这里看到了很多答案,但没有一个有效。我正在使用omniauth-oauth2gem与第三方客户集成。我正在使用描述的设置阶段here但我总是收到这个错误:Authenticationfailure!failed_to_connect:Faraday::Error::ConnectionFailed,SSL_connectSYSCALLreturned=5errno=0state=SSLv2/v3readserverhelloAFaraday::Error::ConnectionFailed(SSL_connectSYSCALLreturned=5errno=0state=SSLv2

  10. Ruby - 打开 ("file_path") - Errno::ENOENT: 没有那个文件或目录 - 2

    尝试打开文件时,我不断收到此Nosuchfileordirectory错误。我在做:file=open("http://farm7.static.flickr.com/6064/6090089285_242ca0e342_m.jpg")根据ruby-doc并不断收到这样的错误。我做错了什么? 最佳答案 你必须require'open-uri'不需要'open-uri',我在我的irb中得到了这个确切的错误消息:Errno::ENOENT:Nosuchfileordirectory 关于R

随机推荐