winapi – 从我自己的代码中返回劫持Windows错误代码的规则是什
WinError.h中定义的错误代码是否可以自由劫持并通过自己的代码返回?
定义了一些通用的Win32错误代码: > ERROR_FILE_NOT_FOUND:“系统找不到指定的文件.” 当然,当找不到文件时,我可以将它用于我自己的目的. 然后还有一些通用错误: > ERROR_ACCESS_DENIED:“访问被拒绝.” 但通常都会理解在尝试访问文件时会出现此错误.我可能有一个HttpGet()函数,如果服务器返回401,则返回ERROR_ACCESS_DENIED. 但是,有些代码被定义为用于特定目的.想象一下,如果https证书不是我们支持的类型,我的HttpGet()函数会抛出错误: > ERROR_IPSEC_IKE_INVALID_CERT_TYPE:“证书类型无效” 除了在WinError.h中定义的代码非常清楚属于IPSec: /////////////////////////////////////////////////// // // // Start of IPSec Error codes // // // // 13000 to 13999 // /////////////////////////////////////////////////// ... // // MessageId: ERROR_IPSEC_IKE_INVALID_CERT_TYPE // // MessageText: // // Invalid certificate type // #define ERROR_IPSEC_IKE_INVALID_CERT_TYPE 13819L 但错误文本正是我想要的! 我们有一个金融系统,需要第二个用户批准交易;这意味着输入的凭据必须是与第一个人不同的用户: > MK_E_MUSTBOTHERUSER:“操作成功所需的用户输入” 也许: > ERROR_LOGON_TYPE_NOT_GRANTED:“登录失败:未在此计算机上授予用户请求的登录类型.” 我得到的感觉是通过WinError探索,通过它们显示的字符串挑选错误代码并重新设置它们以指示它们不是为其设计的错误,是Raymond会给我一个耳光. Windows错误代码是免费提供的错误代码“池”吗?或者只是从Microsoft的代码返回所有Windows错误代码? 如果我正在创建HRESULTS,我需要使用一些代码.如果用户可以调用 解决方法
定义自己的HRESULT代码时,建议使用
FACILITY_ITF 并在此应用程序定义的代码范围内定义代码.是的,代码在应用程序之间会重叠,但您也可以通过SetErrorInfo API提供其他描述性消息,并通过实现ISupportErrorInfo来指示支持(如果您正在实现COM对象/接口).
COM编程手册的摘录更详细地解释了这一点:COM+ programming: a practical guide using Visual C++ and ATL(第67页). 比这更简单,您可以使用自定义设施代码,这可能在不同的模块中有所不同,因此您可以轻松识别问题的根源. 如果将MESSAGETABLE资源放入二进制文件中,FormatMessage API可以解析HRESULT并提取单个代码的描述文本,就像常规Windows错误代码一样(应用程序仍然需要提供API函数的模块句柄). 另见:Creating your own HRESULT? O.P.编辑: 来自微软的Open Protocol Specification of HRESULTs
这意味着只要我设置C位,我就能组成任何我喜欢的HRESULT.作为一个实际问题,这意味着我可以任何我喜欢的代码,例如: E_LOGON_FAILURE = 0xA007052E; 当然我没有随意提出这个数字. 首先我将高位设置为1,以指示错误: 0x80000000 然后我“选择”一个错误代码,例如1326 (0x52E hex): 0x8000052E 然后我需要选择一个设施.让我们选择,在我不知道,seven: 0x8007052E 最后我设置了the Customer bit,表示它不是Microsoft定义的HRESULT: 0xA007052E 巧合的是,直到最后一步的一切都是微软
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows – 如何关闭从visual studio中打开的“孤立”控制台
- windows 2008r2+php5.6.28环境搭建详细过程
- windows – 如何查看/何时实际完成长文件复制操作?
- windows-server-2003 – IIS无法提供某些文件扩展名
- windows – 我的批处理文件(.cmd)有时会执行部分行
- windows-7 – 公司如何处理同一用户对不同Java要求的需求?
- 在正在运行的进程上关闭Windows终端
- 将本地化资源.DLL嵌入到C#中的可执行文件中?
- windows-server-2008 – 无法在生产环境中注销,断开或重置终
- 处理Microsoft Exchange电子邮件的另一种方法
- Windows上需要什么权限才能在Vagrant上安装Bower
- windows-phone-7 – 在扩展程序视图中删除垂直行
- .NET Compact Framework应用程序是否与Windows P
- windows – 在安装之前检测MSI是否需要重新启动
- windows-8 – Windows Phone 8 SDK可以安装在Win
- JNI开发的流程①
- 在正在运行的进程上关闭Windows终端
- haskell – 仅从全屏浮动窗口中移除边框(XMonad配
- windows-vista – Vista Ultimate 64 w / SP1还可
- 如何在Windows Phone 8(C#)框架中添加C DLL