解释错误代码

在确定了哪个应用程序是造成问题的根源之后,需要找出发生了什么错误。 根据应用程序使用的语言,会以不同的格式提出和报告错误。

在 Microsoft Visual C++ 中,使用称为 HRESULT 的 32 位数字返回成功、警告和失败值。 有关系统定义的 HRESULT 值的列表,请参阅 Windows SDK 附带的标头文件 Winerror.h。 此文件包括所有 COM+ 错误代码和说明。 有关 HRESULT 值的详细信息,请参阅错误处理

在 Java 语言中,将引发 com.ms.com.ComFailException 实例以指示失败,其中 ComFailException 对象指定 HRESULT。 com.ms.com.ComSuccessException 的实例指示成功,返回值为 False。 有关解释这些异常的信息,请参阅 Microsoft Visual J++ 文档。

注意

托管 Visual J++ 对象的 COM+ 应用程序服务器进程不会空闲(即使没有活动对象),除非在 VJ6 IDE 中关闭 JIT 调试。 有关如何执行此操作的信息,请参阅 Visual J++ 文档。

在 Visual Basic 中,可以通过检查 Err.Number 属性来检索 HRESULT 值。 可以使用 Err.Description 属性检索错误的说明。

还可以使用 Microsoft Visual Studio 中的 ERRLOOK 实用工具,检索系统错误消息或模块错误消息。 如果从 Visual Studio 调试器或其他启用自动化的应用程序拖放十六进制或十进制值,则 ERRLOOK 会自动检索错误消息文本。 还可以通过键入值或从 IDE 剪贴板粘贴值并单击查找选项来输入值。

以下 C++ 方法根据输入 HRESULT 输出错误的说明。

#include <stdio.h>
#include <windows.h>
#include <tchar.h>

void ErrorDescription(HRESULT hr) 
{ 
     if(FACILITY_WINDOWS == HRESULT_FACILITY(hr)) 
         hr = HRESULT_CODE(hr); 
     TCHAR* szErrMsg; 

     if(FormatMessage( 
       FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 
       NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
       (LPTSTR)&szErrMsg, 0, NULL) != 0) 
     { 
         _tprintf(TEXT("%s"), szErrMsg); 
         LocalFree(szErrMsg); 
     } else 
         _tprintf( TEXT("[Could not find a description for error # %#x.]\n"), hr); 
}

下表提供了 COM+ 中常见错误代码的说明。

错误代码 定义
COMADMIN_E_ALREADYINSTALLED
对象已注册。
COMADMIN_E_APP_FILE_READFAIL
读取应用程序文件时出错。
COMADMIN_E_APP_FILE_VERSION
应用程序文件中的版本号无效。
COMADMIN_E_APP_FILE_WRITEFAIL
写入应用程序文件时出错。
COMADMIN_E_APPDIRNOTFOUND
找不到应用程序安装目录。
COMQC_E_APPLICATION_NOT_QUEUED
只能使用“queue”名字对象创建标记为“已排队”的 COM+ 应用程序。
COMADMIN_E_APPLICATIONEXISTS
应用程序已安装。
COMADMIN_E_APPLID_MATCHES_CLSID
此计算机上已安装与新应用程序 ID 具有相同 GUID 的 CLSID。
COMADMIN_E_APP_NOT_RUNNING
指定的应用程序当前未运行。
COMADMIN_E_AUTHENTICATIONLEVEL
无法为更新请求设置所需的身份验证级别。
COMADMIN_E_BADPATH
文件路径无效。
COMADMIN_E_BADREGISTRYLIBID
已注册的类型库 ID 无效。
COMADMIN_E_BADREGISTRYPROGID
组件的 ProgID 缺失或损坏。
COMADMIN_E_CAN_NOT_EXPORT_APP_PROXY
应用程序代理不可导出。
COMADMIN_E_CAN_NOT_START_APP
无法启动应用程序,因为它是库应用程序或应用程序代理。
COMADMIN_E_CAN_NOT_EXPORT_SYS_APP
系统应用程序不可导出。
COMADMIN_E_CANT_SUBSCRIBE_TO_COMPONENT
用户无法订阅此组件,因为该组件可能已导入。
COMADMIN_E_CANTCOPYFILE
复制文件时出错。
COMADMIN_E_CLSIDORIIDMISMATCH
应用程序文件 CLSID 或 IID 与相应的 DLL 不匹配。
COMADMIN_E_COMP_MOVE_BAD_DEST
组件移动失败,因为目标应用程序不再存在。
COMADMIN_E_COMP_MOVE_LOCKED
不允许组件移动,因为源应用程序或目标应用程序要么是系统应用程序,要么当前已锁定以阻止更改。
COMADMIN_E_COMPFILE_BADTLB
无法加载类型库。
COMADMIN_E_COMPFILE_CLASSNOTAVAIL
DLL 不支持类型库中列出的组件。
COMADMIN_E_COMPFILE_DOESNOTEXIST
此文件不存在。
COMADMIN_E_COMPFILE_GETCLASSOBJ
DLL 中的 GetClassObject 方法失败。
COMADMIN_E_COMPFILE_LOADDLLFAIL
无法加载 DLL。
COMADMIN_E_COMPFILE_NOREGISTRAR
此文件中引用的组件注册器不可用。
COMADMIN_E_COMPFILE_NOTINSTALLABLE
该文件不包含组件或组件信息。
COMADMIN_E_COREQCOMPINSTALLED
已安装同一 DLL 中的组件。
COMADMIN_E_DLLLOADFAILED
无法加载 DLL。
COMADMIN_E_DLLREGISTERSERVER
安装组件时 DllRegisterServer 函数失败。
COMADMIN_E_EVENTCLASS_CANT_BE_SUBSCRIBER
不能将事件类配置为订阅服务器组件。 尝试使用事件类作为订阅服务器创建订阅时,将返回此错误。
COMADMIN_E_INVALIDUSERIDS
应用程序文件中的一个或多个用户无效。
COMADMIN_E_KEYMISSING
在目录中找不到该对象。
COMADMIN_E_LIB_APP_PROXY_INCOMPATIBLE
库应用程序和应用程序代理不兼容。 当尝试导出应用程序代理并且应用程序的激活属性是库时,将返回此错误。
COMADMIN_E_NOREGISTRYCLSID
组件的 CLSID 缺失或损坏。
COMADMIN_E_NOSERVERSHARE
没有可用的服务器文件共享。
COMADMIN_E_NOTCHANGEABLE
已禁用对此对象及其子对象的更改。
COMADMIN_E_NOTDELETEABLE
已对此对象禁用删除功能。
COMADMIN_E_NOTINREGISTRY
在注册表中找不到对象。
COMADMIN_E_NOUSER
一个或多个用户无效。
COMADMIN_E_OBJECT_DOES_NOT_EXIST
找不到其中一个指定对象。
COMADMIN_E_OBJECT_PARENT_MISSING
要插入或更新的对象之一不属于有效的父集合。
COMADMIN_E_OBJECTERRORS
访问一个或多个对象时出错。 有关详细信息,请参阅 ErrorInfo 集合。
COMADMIN_E_OBJECTEXISTS
尝试添加或重命名的对象已存在。
COMADMIN_E_OBJECTINVALID
一个或多个对象的属性缺失或无效。
COMADMIN_E_OBJECTNOTPOOLABLE
无法共用此对象。
COMADMIN_E_PROPERTYSAVEFAILED
一个或多个属性设置无效或相互冲突。
COMADMIN_E_PROPERTY_OVERFLOW
属性值太大。
COMADMIN_E_REGFILE_CORRUPT
注册文件已损坏。
COMADMIN_E_REGISTERTLB
系统无法注册类型库。
COMADMIN_E_REGISTRARFAILED
组件注册器中发生错误。
COMADMIN_E_REMOTEINTERFACE
接口信息缺失或更改。
COMADMIN_E_REQUIRES_DIFFERENT_PLATFORM
此平台上未启用此操作。
COMADMIN_E_ROLE_DOES_NOT_EXIST
分配给组件、接口或方法的角色在应用程序中不存在。
COMADMIN_E_ROLEEXISTS
角色已存在。
COMADMIN_E_SERVICENOTINSTALLED
未安装该服务。
COMADMIN_E_SESSION
不支持服务器目录版本。
COMADMIN_S_SOMEALREADYPAUSED
已暂停一个或多个指定的应用程序进程。
COMADMIN_S_SOMEALREADYRUNNING
一个或多个指定的应用程序进程已在运行。
COMADMIN_E_START_APP_NEEDS_COMPONENTS
若要启动应用程序,应用程序中必须有组件。
COMADMIN_E_SVCAPP_NOT_POOLABLE_OR_RECYCLABLE
作为 NT 服务运行的 COM+ 应用程序可能不会标记为共用或回收。
COMADMIN_E_SYSTEMAPP
无法对系统应用程序执行此操作。
COMADMIN_E_USER_IN_SET
已将一个或多个用户分配到本地分区集。
COMADMIN_E_USERPASSWDNOTVALID
应用程序上设置的标识或密码无效。

故障隔离和 Failfast 策略

查找错误来源

COM+ 如何修改返回值

COM+ 中的错误处理策略

故障排除