65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 VC++ 中的 COM+ 管理对象以编程方式管理 COM+ 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.17/5 (5投票s)

2001年1月26日

viewsIcon

118947

downloadIcon

1405

介绍用于提供访问和操作所有COM+配置数据的方式的COM+管理对象。

  • 下载演示项目 - 50 Kb
  • 引言

    在我遇到需要通过MMC管理单元更改组件的构造函数字符串,并允许通过某些安装脚本一次性添加预定角色集并分配用户给它们的需要时,我开始探索COM+应用程序的编程管理。

    该项目涉及一个典型的WinDNA应用程序,其中COM+组件在中层保存业务逻辑。一个安装应用程序安装了COM+应用程序及其组件和所有属性。

    通常,每个COM+应用程序都有以下可配置参数,其中一些可以通过组件服务工具进行设置,而另一些则不能:(有关详细信息,请参阅MSDN/Platform SDK/Component Services/COM+/Reference/COM+ Administrator’s Reference)

    • AccessChecksLevel
    • 激活
    • ApplicationAccessChecksEnabled
    • ApplicationProxy
    • ApplicationProxyServerName
    • 身份验证
    • AuthenticationCapability
    • Changeable
    • CommandLine
    • CreatedBy
    • CRMEnabled
    • CRMLogFile
    • Deleteable
    • 描述
    • EventsEnabled
    • ID
    • ImpersonationLevel
    • 身份
    • IsSystem
    • 名称
    • 密码
    • QueuingEnabled
    • QueueListenerEnabled
    • RunForever
    • ShutdownAfter
    • 3GigSupportEnabled

    对于应用程序中的各个组件,会配置以下参数:

    • AllowInprocSubscribers
    • ApplicationID
    • CLSID
    • ComponentAccessChecksEnabled
    • COMTIIntrinsics
    • ConstructionEnabled
    • ConstructorString
    • CreationTimeout
    • 描述
    • DLL
    • EventTrackingEnabled
    • ExceptionClass
    • FireInParallel
    • IISIntrinsics
    • IsEventClass
    • JustInTimeActivation
    • LoadBalancingSupported
    • MaxPoolSize
    • MinPoolSize
    • MultiInterfacePublisherFilterCLSID
    • MustRunInClientContext
    • ObjectPoolingEnabled
    • ProgID
    • PublisherID,
    • 同步
    • ThreadingModel
    • 事务
    • VersionBuild
    • VersionMajor
    • VersionMinor
    • VersionSubBuild

    有关其他相关集合(如Roles、RolesForComponent等)的完整列表,请参阅Platform SDK文档。

    COM+管理对象提供了配置上述所有参数的编程方法。

    管理对象提供了一种访问和操作所有COM+配置数据的方式,这些数据也可以通过组件服务管理工具进行访问。您可以使用这些对象来自动化COM+管理中的所有任务。这些管理对象允许我们读取和写入存储在COM+目录中的信息,COM+目录是保存所有COM+配置数据的底层数据存储。

    在MSDN和Platform SDK中,没有为VC++开发人员提供示例代码(至少我没找到)。所以我决定写一个。

    Visual Studio不附带COMAdmin.dll的头文件或IDL文件。因此,不像在项目中包含头文件并使用CoCreateInstance来处理适当的coclass上的适当接口那样容易。

    OLEVIEW中的COM+ 1.0类型库看起来是这样的。

    我发现COM+管理对象由三个组件(IDL中的coclasses)组成。每个组件都有一个主要的dispinterface作为默认接口(因为每个coclass只实现一个接口)。例如,coclass COMAdminCatalog实现了一个接口ICOMAdminCatalog。

    coclass COMAdminCatalog {                     
    	[default] interface ICOMAdminCatalog;
    }; 

    该组件代表COM+目录管理器。

    我猜测这些组件暴露dispinterfaces的原因是它们需要通过WSH下运行的安装脚本或通过VB来访问。

    关于对象,有逻辑集合,如Applications、Components和Roles,它们映射到COMAdminCatalogCollection组件。类似地,逻辑集合如ApplicationComponentRole映射到COMAdminCatalogObject组件。COMAdminCatalog是根对象,包含Applications集合。Roles和Components集合可以从Applications集合中检索。类似地,组件特定的其他集合,如“RolesForComponent”,可以从Components集合中检索。

    当我提到dispinterfaces时,你听到‘呀’了吗?天哪!!在C++中编程不是很**痛苦**吗 - GetIdOfNamesDISPIDSInvoke

    VB开发人员永远不必处理原始的VARIANT结构、设置鉴别符、调用SysAllocString来分配BSTR。但在C++中,我们必须这样做!

    这是否意味着在C++中编写COM+管理对象很困难?

    不!示例代码使用#import指令来包含COM+管理类型库中的信息。

    示例是一个简单的Win32应用程序。通过一些智能指针代码,代码看起来与VB代码相似。:)

    你只需要说

    #import "c:\\winnt\\system32\\com\\Comadmin.dll"  no_namespace

    no_namespace指令编译器不要在命名空间中生成类型库信息,因此Interface名称等内容不需要加上namespace::前缀。

    好了,你就可以使用组件了,而无需再接触IUnknown。所有的AddRef()Release()QueryInterface都默默地完成了。

    例如

    ICOMAdminCatalogPtr spCatalog("COMAdmin.COMAdminCatalog"); 

    上面的调用被转换为对COMAdminCatalog组件的CoCreateInstance调用,并检索到接口指针。

    其余代码与VB类似。

    示例执行以下操作:

    • 创建一个名为“HelloWorld”的COM+应用程序“HelloWorld”,
    • 将一个HelloWorld组件安装到应用程序中,
    • 设置应用程序可能需要的各种角色,
    • 为每个组件(在此例中为一个)明确设置角色。
    • 为组件设置ConstructorString

    我包含了一个示例VB activeX DLL项目HelloWorld.vbp,它公开了一个方法,你可以用自己的组件替换它(如果你愿意)。更改#defines的默认值,如果你想覆盖HelloWorld应用程序的默认值,尤其是HELLOWORLD_DLL_PATH的值,以反映VB示例DLL所在的位置。

    请更改#define中的组件路径,以反映您希望包含在COM+应用程序中的组件的路径。

    请查找随附的带有HelloWorld VB组件的演示项目,该项目可用于添加到COM+应用程序中。

    本文是我在编程COM+管理对象方面的经验结果。我假设应用程序将在足够的权限下运行。

    如果代码有效,那么它是我写的,否则我就不知道是谁写的了。

    参考文献

    • Platform SDK文档,
    • Ted Pattison在MSDN上关于COM+管理对象的文章。

    © . All rights reserved.