草庐IT

c++ - CopyFileEx 会出现哪些错误代码?

coder 2023-11-17 原文

我正在编写一些需要调用 CopyFileEx 函数的 C++ 代码。与大多数其他 WIN32 函数一样,CopyFileEx 的文档说:

如果函数失败,返回值为零。要获取扩展的错误信息,请调用 GetLastError。

这一切都很好 - 但是有人知道我在哪里可以找到特定 API 函数可能通过 GetLastError 返回的错误代码列表吗?在这种情况下,我想以不同的方式处理不同的错误情况,但没有此函数的错误代码列表 我将简化为生成我想处理的错误情况,只是为了看看产生了什么错误代码或通过从数字 0 到 15999 的系统错误代码尝试猜测哪些可能适用!

编辑:这里有更多的上下文来帮助解释这个问题,以及为什么我想知道是否有一个可以由函数在任何地方返回的错误代码的明确列表。

该代码将用作 Windows 服务的一部分,因此虽然有用户,但他们不会总是在那里响应错误。我需要能够区分不需要每次都报告的错误,如果文件被锁定,我只是稍后再试一次。如果我没有读取特定文件的权限,我可以记录问题并继续,如果目标目录不可读或已满,那么我希望服务停止并触发报告过程,这将引起用户的注意用户。

如果没有完整的 CopyFileEx 失败方式列表,我发现很难做到这一点。

最佳答案

Microsoft 没有给出一个 API 可能返回的所有错误代码的列表,原因很简单,该列表可能会随着时间和 Windows 的各种实现、安装的驱动程序或简单的疏忽而改变(API 通常返回由调用的其他 API 引起的错误在你调用的那个中)。

有时文档会指出该 API 的用户特别感兴趣的特定错误,但通常他们不会有明确的完整错误列表。他们也不应该,这很不幸,但却是生活中的事实。

我同情你的困境 - 很多时候我都希望得到这类信息,这样我可以更好地了解如何处理应该预料到的问题 - 特别是那些具有合理恢复路径的问题。通常我会尝试通过测试来找到 API 的故障行为来解决这个问题,我想避免这种情况,因为这很痛苦,而且对于确保我已经涵盖所有场景或针对 future 没有多大帮助差异。

然而,涵盖所有场景(包含完整的错误代码列表)或防止 future 的更改确实是一个不可能实现的目标。考虑一下 Microsoft 可能必须如何管理记录 Win32 中所有可能的错误代码:

假设 Win32 API 只有 2 个函数:foo()bar()foo() 可能会产生自己的错误,ERROR_FOObar() 可能会产生自己的错误,ERROR_BAR。但是,foo() 调用 bar(),因此如果调用 foo() 也可能返回 ERROR_BAR bar() 返回该错误。

文档反射(reflect)了以下内容:

  • foo() 可能会返回 ERROR_FOOERROR_BAR
  • bar() 可能会返回 ERROR_BAR

现在,当 API v2 发布时,bar() 已扩展为也返回 ERROR_BAZ。对于这个 API 的大小,管理起来很简单,需要更新 bar() 的文档以添加新的错误代码(但是,请注意,对于像真正的 Win32 这样大的 API 和像 MS 这样大的组织,这可能不是真的,但让我们假设它是。

但是,将新错误添加到 bar() 的人无法直接看到 foo() 的行为也发生了变化它可能返回的错误。在这么小的 API 中,这可能没什么大不了的——在像 Win32 这样的东西中,它会是一团糟。现在抛出一个事实,即 Win32 可能依赖于第 3 方代码(驱动程序、插件、COM 对象等),现在这个任务几乎是不可能完成的。

实际上这不一定是一个很好的例子,因为如果错误代码是 API 契约(Contract)的一部分,ERROR_BAZ 就永远不会出现。

所以这是另一种情况:API 有一个 OpenObject() 函数,可以返回 ERROR_NO_MEMORYERROR_NOT_FOUND。最初开发该系统时,它没有安全概念(比如 MS-DOS),但新版本增加了访问控制。现在我们希望 OpenObject() 能够返回 ERROR_ACCESS_DENIED,但它不能,因为这会改变契约,所以一个新的 API OpenObjectEx( ) 被添加来处理这种情况。这里至少有两个问题:

  • 随着时间的推移,您会看到 API 的爆炸式增长,与旧 API 相比,这些 API 几乎没有或根本没有增加值(value)
  • 调用旧的 OpenObject() API 并由于访问限制而失败的遗留应用程序应该怎么办?契约(Contract)规定的错误返回都不能说明问题的真相。

这个问题是许多人认为异常规范(在 C++ 或 Java 中)不是一个好主意的原因之一。

关于c++ - CopyFileEx 会出现哪些错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1378250/

有关c++ - CopyFileEx 会出现哪些错误代码?的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  9. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  10. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

随机推荐