Visual Basic调试COM+组件遇到的问题

系统 1759 0

Visual Basic 调试 COM+ 组件遇到的问题

Article last modified on 2002-1-20

--------------------------------------------------------

The information in this article applies to:

       - Microsoft Visual Basic Enterprise Edition for Windows, versions 6.0(SP 5)

--------------------------------------------------------

 

现象

 

Visual Basic 创建的 COM 组件放置到 COM+ 中的某个应用下后,在某种情况下调试时, Visual Basic IDE 会弹出如下对话框:

"System Error &H80004015(-2147467243).运行单一线程时再次调用ConInitialize." 

重新产生本现象的步骤

 

Visual Basic 版本: 6.0(SP5)

*           Visual Basic 创建一个 Active Dll Class Modules 的名字为 WrongServerID Project 名字为 Test

*           Project 的设置均按缺省情况;

*           添加一个方法 Run ,随便加几句代码;

*           Make Test.Dll

*           Test.Dll 放置到 COM+ 的一个应用中, COM+ 应用的标识设置有以下三种情况:

1

标识为“交互式用户 --- 目前已登录的用户”!

这时 Visual Basic IDE 可以调试 Test.Dll

2

标识为当前登录的用户名!

Visual Basic IDE 可以调试 Test.Dll

3

标识的用户不是当前登录的用户名!

这时调试 Test.Dll ,就会遇到 0x80004015 的错误对话框!

 

 

原因

              
                
                  
                    这个错误在《
                  
                
                
                  INFO: Translating Automation Errors for VB/VBA (Long)
                
              
              
                Q186063
              
              
                
                  》是这样定义的:
                
                
                  
                    
                    
                  
                
              
            
              
                
                  -2147467243 (80004015)
                  
                        
                  
                  The class is configured to run as a security id different from the caller. 
          
                  
                  
                
              
            

 

这个定义显然要比 VB IDE 报出的语焉不详的“运行单一线程时尝试再次调用 CoInitialize ”更让人清楚明白!

 

首先,让我们看一看 VB 是怎么做的:

VB IDE 运行一个 ActiveX Dll 时, IDE 将调用 CoRegisterClassObject()

CoRegisterClassObject() 将会察看要调用的进程 (COM Server) 的安全标识是否匹配这个 Class 注册的安全标识。

对于设置为运行在“ Interactive User ”标识下的 Server CoRegisterClassObject() 将会动态地确认当前登录的交互式用户的标识,以完成这种比较。

但是对于设置为运行在不同于当前登录用户的另一个用户标识下的 Server

RunningObjectTable::Register(ROTFLAGS_ALLOWANYCLIENT) 将会返回

CO_E_WRONG_SERVER_IDENTITY ,这样是为了强制安全,阻止了恶意欺骗。 COM 不相信调用 CoRegisterClassObject() 的代码,它只相信注册表 ( 注册表是一个安全的数据库 )

于是 -2147467243 (80004015)的错误就出现了。

 

那么上面所说的 Class 注册的安全标识在哪里查到呢??

我的 Test.WrongServerID CLSID {54BD886F-76CB-49E9-8515-5992B9F9CC50} ,所以在注册表的

HKEY_CLASSES_ROOT\AppID\{54BD886F-76CB-49E9-8515-5992B9F9CC50} 下:

RunAs ”的值就是。它还可以为“ mydomain\myaccount ”、“ Interactive User ”等值。

 

但是 COM+ 应用的标识设置的改变,却并没有在这个键值上体现出来。所以如果把组件不放入到 COM+ 中,则 Class 注册的安全标识应该依赖于这个“ RunAs ”键值。那么把组件放入到 COM+ 之后,看哪一个键值呢 ?

我猜想这已经存入到 COM+ 自己的数据库了,而不再是注册表。这个有待研究。

 

小结

当一个 client 试图调用一个 COM Server ,需要在 client server 之间建立一个经过验证的 COM Session 。这时 COM 需要检查双方的安全性。

Server 调用 CoRegisterClassObject() 注册它的 Classes 。然后 COM 试图假冒 client 来调用该 Server

对于我们这种情况, Visual Bsic IDE 用的是当前登录用户的标识,而这个标识是通不过 Server 端的验证的。

 

参考文献:

1.    PRB: System Error Message "&H80004015" Running ActiveX DLL in ID [Q228487]

2.    COM Security Frequently Asked Questions [Q158508]

3.    FIX: CoRegisterClassObject Fails with CO_E_WRONG_SERVER_IDENTITY [Q170364]

4.    INFO: COM Servers Activation and NT Windows Stations [Q169321]

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12659


Visual Basic调试COM+组件遇到的问题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论