• COM Error---HRESULT


    一、COM Error

    调用COM接口产生的错误。几乎所有的COM函数和接口方法都返回类型为HRESULT的值。HRESULT(用于结果句柄)是返回成功、警告和错误值的一种方法。HRESULTs实际上不是任何事物的句柄;它们只是值中有几个字段编码的值。根据COM规范,结果为零表示成功,非零表示失败。

    二、COM Error Code(HRESULT)

    也是一个32bit的值,大多数的值也是定义了默认的错误消息。它的构成如下

    S (1 bit):严重程度,1为失败,0为成功

    R (1 bit): 如果N=0,必须设置为1,N=0,该位被NTSTATUS定义

    C (1 bit): 是否是客户定义,还是微软定义的错误.1是客户定制

    N (1 bit): 标识是否是一个NTSTATUS的值,0的话可以把NTSTATUS值映射为一个HRESULT值

    X (1 bit):  保留位,永远是0

    Facility (11 bits):错误来源,取值如下

    Value

    Meaning

    FACILITY_NULL

    0

    The default facility code.

    FACILITY_RPC

    1

    The source of the error code is an RPC subsystem.

    FACILITY_DISPATCH

    2

    The source of the error code is a COM Dispatch.

    FACILITY_STORAGE

    3

    The source of the error code is OLE Storage.

    FACILITY_ITF

    4

    The source of the error code is COM/OLE Interface management.

    FACILITY_WIN32

    7

    This region is reserved to map undecorated error codes into HRESULTs.

    FACILITY_WINDOWS

    8

    The source of the error code is the Windows subsystem.

    FACILITY_SECURITY

    9

    The source of the error code is the Security API layer.

    FACILITY_SSPI

    9

    The source of the error code is the Security API layer.

    FACILITY_CONTROL

    10

    The source of the error code is the control mechanism.

    FACILITY_CERT

    11

    The source of the error code is a certificate client or server? 

    FACILITY_INTERNET

    12

    The source of the error code is Wininet related.

    FACILITY_MEDIASERVER

    13

    The source of the error code is the Windows Media Server.

    FACILITY_MSMQ

    14

    The source of the error code is the Microsoft Message Queue.

    FACILITY_SETUPAPI

    15

    The source of the error code is the Setup API.

    FACILITY_SCARD

    16

    The source of the error code is the Smart-card subsystem.

    FACILITY_COMPLUS

    17

    The source of the error code is COM+.

    FACILITY_AAF

    18

    The source of the error code is the Microsoft agent.

    FACILITY_URT

    19

    The source of the error code is .NET CLR.

    FACILITY_ACS

    20

    The source of the error code is the audit collection service.

    FACILITY_DPLAY

    21

    The source of the error code is Direct Play.

    FACILITY_UMI

    22

    The source of the error code is the ubiquitous memoryintrospection service.

    FACILITY_SXS

    23

    The source of the error code is Side-by-side servicing.

    FACILITY_WINDOWS_CE

    24

    The error code is specific to Windows CE.

    FACILITY_HTTP

    25

    The source of the error code is HTTP support.

    FACILITY_USERMODE_COMMONLOG

    26

    The source of the error code is common Logging support.

    FACILITY_USERMODE_FILTER_MANAGER

    31

    The source of the error code is the user mode filter manager.

    FACILITY_BACKGROUNDCOPY

    32

    The source of the error code is background copy control

    FACILITY_CONFIGURATION

    33

    The source of the error code is configuration services.

    FACILITY_STATE_MANAGEMENT

    34

    The source of the error code is state management services.

    FACILITY_METADIRECTORY

    35

    The source of the error code is the Microsoft Identity Server.

    FACILITY_WINDOWSUPDATE

    36

    The source of the error code is a Windows update.

    FACILITY_DIRECTORYSERVICE

    37

    The source of the error code is Active Directory.

    FACILITY_GRAPHICS

    38

    The source of the error code is the graphics drivers.

    FACILITY_SHELL

    39

    The source of the error code is the user Shell.

    FACILITY_TPM_SERVICES

    40

    The source of the error code is the Trusted Platform Module services.

    FACILITY_TPM_SOFTWARE

    41

    The source of the error code is the Trusted Platform Module applications.

    FACILITY_PLA

    48

    The source of the error code is Performance Logs and Alerts

    FACILITY_FVE

    49

    The source of the error code is Full volume encryption.

    FACILITY_FWP

    50

    he source of the error code is the Firewall Platform.

    FACILITY_WINRM

    51

    The source of the error code is the Windows Resource Manager.

    FACILITY_NDIS

    52

    The source of the error code is the Network Driver Interface.

    FACILITY_USERMODE_HYPERVISOR

    53

    The source of the error code is the Usermode Hypervisor components.

    FACILITY_CMI

    54

    The source of the error code is the Configuration Management Infrastructure.

    FACILITY_USERMODE_VIRTUALIZATION

    55

    The source of the error code is the user mode virtualization subsystem.

    FACILITY_USERMODE_VOLMGR

    56

    The source of the error code is  the user mode volume manager

    FACILITY_BCD

    57

    The source of the error code is the Boot Configuration Database.

    FACILITY_USERMODE_VHD

    58

    The source of the error code is user mode virtual hard disk support.

    FACILITY_SDIAG

    60

    The source of the error code is System Diagnostics.

    FACILITY_WEBSERVICES

    61

    The source of the error code is the Web Services.

    FACILITY_WINDOWS_DEFENDER

    80

    The source of the error code is a Windows Defender component.

    FACILITY_OPC

    81

    The source of the error code is the open connectivity service.

    Code (2 bytes): 结果码,有一部分值是从Win32 Error Code和NTSTATUS继承来的。

    在源代码级别,所有错误值都由三部分组成,由下划线分隔。第一部分是识别与错误相关联的设施的前缀,第二部分是E表示错误,第三部分是描述实际情况的字符串。例如,当硬盘上没有剩余空间时,会返回STG_E_MEDIUMFULL。stg前缀表示存储设备,e表示状态代码表示错误,MEDIUMFULL提供有关错误的特定信息。

    三、HRESULT

    3.1、HRESULT的定义

    在头文件winnt.h里,HRESULT定义如下:

    // Component Object Model defines, and macros
    #ifndef _HRESULT_DEFINED
    #define _HRESULT_DEFINED
    typedef LONG HRESULT;
    #endif // !_HRESULT_DEFINED

    值就是COM Error Code。

    3.2、获取和检测

    从定义可以看到 HRESULT被定义为了LONG型,也就是把COM Error Code当成一个4字节的有符号数来处理,这样一来就可以把Error Code的最高位S当成符号位,0时是正数,1时是负数,当我们调用COM接口,就可以用下面的宏来检测COM接口的返回值

    #define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
    #define FAILED(Status) ((HRESULT)(Status) <0)

    成功的代码有多个,失败的代码也有多个,一个COM接口在各种情况下返回的状态代码通常将包含多个成功代码及多个失败代码。这就是我们为什么要使用SUCCEEDED及FAILED宏的原因。一般不能直接将HRESULT值同某个成功代码(如S_OK)进行比较以决定某个函数是否成功。

    3.3、获取错误消息

    也是通过这个函数来获取

    DWORD WINAPI FormatMessage (
                                DWORD dwFlags, // source and processing options
                                LPCVOID lpSource, // message source
                                DWORD dwMessageId, // message identifier
                                DWORD dwLanguageId, // language identifier
                                LPTSTR lpBuffer, // message buffer
                                DWORD nSize, // maximum size of message buffer
                                va_list *Arguments // array of message inserts
     
                                );
  • 相关阅读:
    mysql 优化(包含sql语句的书写)
    tomcat优化
    MySQL——修改root密码的4种方法(以windows为例)
    实现窗口中的文档自动向上滚动,方便阅读
    处理文本框的鼠标事件,判断鼠标的状态
    通过给事件处理程序传递this参数,获取事件源对象的引用。单机提交按钮时在信息框中显示用户输入的字符。
    在标签的事件属性字符串中编写程序,检查用户输入的密码明文
    通过使用浏览器对象模型,输出当前浏览器窗口中打开的文档的URL信息,并将显示在窗口中。
    创建一个卡片对象,卡片上标有“名字”、“地址”和“电话”等信息。名片对象提供一个方法以输出这些信息。
    测试Array对象的sort方法的作用。将1985,1970,1999,1998,2000,1963这些年份按升序输出。
  • 原文地址:https://www.cnblogs.com/yilang/p/11159002.html
Copyright © 2020-2023  润新知