CoRegisterClassObject返回错误(会话0?)
CoRegisterClassObject returns error (session 0?)
客户正在运行我们的一个程序,通常作为服务或应用程序运行。客户在CoRegisterClassObject()
上得到以下错误:
类被配置为作为与调用者不同的安全id运行。
它看起来像是某种类型的会话0错误,但是为什么CoRegisterClassObject()
要关心会话0?COM应该允许服务(会话0)和应用程序(会话> 0),而不是关心什么注册什么,不是吗?
另外,我不喜欢这样的事实,即它不在CoRegisterClassObject()
可返回的错误列表中,根据微软文档网页。
错误码为CO_E_WRONG_SERVER_IDENTITY
(0x80004015)。
本页:
COM安全常见问题解答
Q6为什么CoRegisterClassObject返回CO_E_WRONG_SERVER_IDENTITY?当启动我的ATL 1.1服务器服务作为。exe文件时,我从CoRegisterClassObject接收coe_wrong_server_identity。(类被配置为作为与调用者不同的安全ID运行。)无论我是否跳过CoInitializeSecurity,都会出现这种情况。它无法作为服务或.exe文件运行。
。许多服务都是通过在交互式用户身份中将它们作为控制台应用程序运行来调试的。由于服务已经注册为以不同的身份运行(由Services控制面板小程序配置),OLE通过返回CO_E_WRONG_SERVER_IDENTITY使CoRegisterClassObject和RunningObjectTable::Register(ROTFLAGS_ALLOWANYCLIENT)调用失败,以加强安全性并防止恶意服务器欺骗服务器。要通过以交互用户的身份运行进行调试,请在服务器的注册表项中进行以下更改,以防止这些故障:
•为了防止CoRegisterClassObject失败,请删除以下命名值:
[HKEY_CLASSES_ROOTAPPID{0bf52b15-8cab-11cf-8572-00aa00c006cf}] "LocalService"="HelloOleServerService"
•要防止irunninggobjecttable::Register(ROTFLAGS_ALLOWANYCLIENT)失败,请遵循以下步骤:
删除以下指定值:
[HKEY_CLASSES_ROOTAPPID{0bf52b15-8cab-11cf-8572-00aa00c006cf}] "LocalService"="HelloOleServerService"
然后添加以下命名值:
[HKEY_CLASSES_ROOTAPPID{0bf52b15-8cab-11cf-8572-00aa00c006cf}] "RunAs"="Interactive User"
调试后必须恢复修改后的注册表项。
我假设你必须用你的COM对象的实际CLSID代替{0bf52b15-8cab-11cf-8572-00aa00c006cf}
。
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- 为多个会话保留XPtr
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- CPP/Gdb 返回 0;导致所有用户的会话登录
- CoRegisterClassObject返回错误(会话0?)