Creating a Setting Controller-封装配置文件访问

摘要

本文介绍如何创建设置控制器

本用例可学到的内容

CAACafCtrlToolsOptions 用例

  • CAACafCtrlToolsOptions 的功能
  • 启动 CAACafCtrlToolsOptions 的方法
  • CAACafCtrlToolsOptions 代码存放位置

分步实现

简要总结

参考文献

本用例学习要点

本用例旨在演示如何创建设置控制器组件,以此封装配置文件并保证对其的唯一访问权限。通过设置控制器,多个应用程序可访问存储在配置文件中的参数,且无需了解文件内部存储细节。
 
设置控制器可确保不同应用程序对配置文件的访问方式保持一致,其中 ** 工具 / 选项(Tools/Options)** 命令是最重要的应用程序。
本文介绍了设置控制器的一个实际用例,如需更多说明,请参阅相关主题的技术文献 [1]。
 

CAACafCtrlToolsOptions 用例

CAACafCtrlToolsOptions 是 CAACATIAApplicationFrm.edu 框架下的一个用例,用于演示 CATIAApplicationFrame 框架的功能特性。

CAACafCtrlToolsOptions 的功能

CAACafCtrlToolsOptions 会为配置文件创建设置控制器,相关选项将应用于我们的 CAAGeometry 文档中。
该设置控制器供通过工具 / 选项(Tools/Options)命令打开的图元属性页调用。用例「创建应用程序属性的属性页」[2] 介绍了如何创建该属性页。

图片

 该属性页显示以下分组内的三个参数:

  • “标识符” 分组:用于修改和显示图元标识符的可见性。图元通过 CAAV5 几何创建工作台的命令生成。图元标识符可永久设置为
    • 隐藏
    • 显示
    • 仅在图元预选时显示(即光标悬停在图元上方时)
  • “每条曲线最大点数” 分组:用于修改和显示离散化一条曲线所用的最大点数。
  • “隐含点” 分组:用于修改和显示隐含点的可见性,可设置为显示或隐藏。

这三个参数保存在 CAACafGeometryElt 配置文件中,且必须始终通过 CAACafGeometryEltSettingCtrl 设置控制器进行访问。该控制器是一个组件,实现了以下接口:

  • CATIIniSettingManagment
    该接口定义于 **InteractiveInterfaces(交互接口)** 框架中,用于管理配置库的通用方法,如提交、保存等。
  • CAAICafGeometryEltSettingAtt
    该接口专用于当前配置文件,允许各应用程序获取和设置参数,而无需了解其内部存储细节。

如何启动 CAACafCtrlToolsOptions

有关本用例的详细启动方式,请参见《CAAGeometry 示例》用例中标题为 **“如何启动 CAAGeometry 用例”** 的章节。

CAACafCtrlToolsOptions 代码位置

CAACafCtrlToolsOptions 用例包含各类类与接口,存放于 CAACafCtrlToolsOptions.m 模块,以及 CAACATIAApplicationFrm.edu 框架的 **ProtectedInterfaces(受保护接口)** 目录中:
  • Windows 系统:安装根目录\CAACATIAApplicationFrm.edu\CAACafCtrlToolsOptions.m\
  • Unix 系统:安装根目录/CAACATIAApplicationFrm.edu/CAACafCtrlToolsOptions.m/

其中 安装根目录 指 CAA 安装光盘的安装路径。

这些类与接口说明如下:

  • CAAICafGeometryEltSettingAtt:用于访问各个参数的接口
  • TIE_CAAICafGeometryEltSettingAtt:该接口的 TIE 绑定类
  • CAACafGeometryEltSettingCtrl:设置控制器组件的主类
  • CAAECafGeometryEltSettingAtt:实现 CAAICafGeometryEltSettingAtt 接口的设置控制器组件扩展类
  • CAAECafSettingManagmentForGeometryElt:实现 CATIIniSettingManagment 接口的设置控制器组件扩展类
  • GetCAACafGeometryEltSettingCtrl:用于获取设置控制器的工厂函数

分步实现

创建一个设置控制器主要包含五个步骤:
  1. 创建用于访问各参数的接口
  2. 创建设置控制器组件主类
  3. 实现 CAAICafGeometryEltSettingAtt 接口
  4. 实现 CATIIniSettingManagment 接口
  5. 创建设置控制器的工厂类

创建用于访问各参数的接口

CAAICafGeometryEltSettingAtt 接口专用于访问以下三个参数:
  • 控制图元标识符的显示状态(隐藏、显示、预选时显示)
  • 定义离散化曲线所用的最大点数
  • 控制隐含点的显示状态(隐藏、显示)
  • 头文件

以下是 CAAICafGeometryEltSettingAtt 接口的头文件:

#include "IUnknown.h"
          
#include "CAACafCtrlToolsOptions.h"
extern IID IID_CAAICafGeometryEltSettingAtt;

class CATString;
class CATSettingInfo ;
          
class ExportedByCAACafCtrlToolsOptions CAAICafGeometryEltSettingAtt : public IUnknown
{
  public :
    virtual  HRESULT   Initialize() = 0;

    virtual  HRESULT   GetIdentifierVisibility(CATString & oIdVisibility)        = 0;
    virtual  HRESULT   SetIdentifierVisibility(const CATString & iIdVisibility)  = 0;
    virtual  HRESULT   GetInfoIdentifierVisibility(CATSettingInfo * oInfo)  = 0;
 
    virtual  HRESULT   GetMaxPointCurve(int & oMaxPoint)        = 0;
    virtual  HRESULT   SetMaxPointCurve(const int iMaxPoint)  = 0;
    virtual  HRESULT   GetInfoMaxPointCurve(CATSettingInfo ** oInfoArray, int * oNbSettingInfo)  = 0;

    virtual  HRESULT   GetImplPointVisibility(CATString & oImplPointVisibility)        = 0;
    virtual  HRESULT   SetImplPointVisibility(const CATString & iImplPointVisibility)  = 0;    
    virtual  HRESULT   GetInfoImplPointVisibility(CATSettingInfo * oInfo)  = 0;
    
};
该对象建模器接口继承自 IUnknown 接口。与所有接口一样,它拥有一个以 IID_ 加接口名称命名的接口唯一标识符(IID)。此接口由 CAACafCtrlToolsOptions.m 模块导出。
该接口定义了:
  • 一个 **Initialize(初始化)** 方法。关于该重要方法的更多细节,请参考技术文档《设置控制器》[1]。
  • 针对每个参数,各定义三个方法:
    • Setxxx:修改参数(SetIdentifierVisibilitySetMaxPointCurveSetImplPointVisibility
    • Getxxx:获取参数值(GetIdentifierVisibilityGetMaxPointCurveGetImplPointVisibility
    • GetInfoxxx:获取 CATSettingInfo 实例,用于构建充当锁的对话框对象(GetInfoIdentifierVisibilityGetInfoMaxPointCurveGetInfoImplPointVisibility
  • 源文件
    以下是 CAAICafGeometryEltSettingAtt 接口的源文件:
    #include <CAAICafGeometryEltSettingAtt.h>
    
    IIID IID_CAAICafGeometryEltSettingAtt={ /* 8a2969d2-0e0d-11d5-85c1-00108335648a */
        0x8a2969d2,
        0x0e0d,
        0x11d5,
        {0x85, 0xc1, 0x00, 0x10, 0x83, 0x35, 0x64, 0x8a}
      };
    该文件包含一个全局唯一标识符(GUID)[3],以粗体显示。
  • TIE 文件说明
    要让组件能够实现该接口,必须在 src 目录下创建名为 TIE_CAAICafGeometryEltSettingAtt.tsrc 的文件,文件内容需包含:
    #include "CAAICafGeometryEltSettingAtt.h"
    多工作区应用构建工具(mkmk)将为该接口生成 TIE 绑定类,即位于 ProtectedGenerated 目录下的 TIE_CAAICafGeometryEltSettingAtt.h 文件。

  • 修改 IID 文件
    CNext/code/dictionary 目录下,修改或创建 CAACATIAApplicationFrm.edu.idd 文件,并添加以下一行内容:
    {8a2969d2‑0e0d‑11d5‑85c1‑00108335648a} CAAICafGeometryEltSettingAtt
    第一部分是前两步定义的全局唯一标识符(GUID)[3],第二部分是接口名称。

 

创建设置控制器组件主类

  1. 头文件

以下是 CAACafGeometryEltSettingCtrl 类的头文件:
#include "CATBaseUnknown.h"  
#include "CATIniCleanerSettingCtrl.h"

class  CAACafGeometryEltSettingCtrl : public CATBaseUnknown
{  
   CATDeclareClass;

   public:
 
   CAACafGeometryEltSettingCtrl();
   virtual ~CAACafGeometryEltSettingCtrl();

   static HRESULT GetSettingController(CAACafGeometryEltSettingCtrl ** oCtrl);

 private:
   CAACafGeometryEltSettingCtrl(const CAACafGeometryEltSettingCtrl &iObjectToCopy);
   CAACafGeometryEltSettingCtrl & operator = (const CAACafGeometryEltSettingCtrl &iObjectToCopy);

 private:
   static CATIniCleanerSettingCtrl _CleanerCtrl ;
};
CAACafGeometryEltSettingCtrl 这个 C++ 类继承自 CATBaseUnknown。CATDeclareClass 宏用于声明该类属于一个组件。拷贝构造函数和赋值运算符=被声明为私有,以防止编译器将它们自动生成为公有成员。
CAACafGeometryEltSettingCtrl 组件类在一次会话中仅会被创建一次。GetSettingController 方法返回指向该类的唯一实例指针。为了管理该指针的销毁操作,代码中使用了 CATIniCleanerSettingCtrl 类的实例。静态数据成员 _CleanerCtrl 用于持有这个唯一指针。
  1. 源文件
以下是 CAACafGeometryEltSettingCtrl 的源文件:
 
#include "CAACafGeometryEltSettingCtrl.h"
#include "CAAICafGeometryEltSettingAtt.h"
#include "CATIIniSettingManagment.h"
#include "CATErrorDef.h"
#include "CATBoolean.h"

CATIniCleanerSettingCtrl CAACafGeometryEltSettingCtrl::_CleanerCtrl ;

CATImplementClass(CAACafGeometryEltSettingCtrl,
                     Implementation,
                     CATBaseUnknown ,
                     CATNull);

CAACafGeometryEltSettingCtrl::CAACafGeometryEltSettingCtrl()
{
}

CAACafGeometryEltSettingCtrl::~CAACafGeometryEltSettingCtrl()
{
}
...
静态数据成员 _CleanerCtrl 完成实例化创建。
CATImplementClass 宏通过关键字 Implementation(实现类),声明 CAACafGeometryEltSettingCtrl 类为组件主类,同时该类在对象建模器(OM)层面继承自 CATBaseUnknown。
构造函数与析构函数均为空实现。
HRESULT CAACafGeometryEltSettingCtrl::GetSettingController
                                      (CAACafGeometryEltSettingCtrl ** oCtrl)
{
 // 定义返回码,初始为执行成功
 HRESULT rc = S_OK ;

        // 校验输出参数指针是否有效
        if ( NULL != oCtrl )
        {
           *oCtrl = NULL ;

           // 从清理控制器中获取已存在的设置控制器实例
           CATBaseUnknown * pCtrl = _CleanerCtrl.GetController();
           // 若当前无实例,则新建
           if ( NULL == pCtrl )
           {
               CAACafGeometryEltSettingCtrl * SettingController = NULL;
               SettingController = new CAACafGeometryEltSettingCtrl();
               // 内存分配失败
               if ( NULL == SettingController )
               {
                  rc = E_OUTOFMEMORY ;
               }else
               {
                  CATBoolean Init = FALSE ;

                  // 初始化操作是强制要求
                  CAAICafGeometryEltSettingAtt * pISettingAtForCtrl = NULL ;
                  // 查询配置参数访问接口
                  rc = SettingController->QueryInterface(IID_CAAICafGeometryEltSettingAtt,
                                                        (void**) &pISettingAtForCtrl );
                  if ( SUCCEEDED(rc) )
                  {
                     // 执行配置初始化
                     rc = pISettingAtForCtrl->Initialize();
                     if ( SUCCEEDED(rc) )
                     {
                        CATIIniSettingManagment * pIMgtAtForCtrl = NULL ;
                        // 查询配置管理接口
                        rc = SettingController->QueryInterface(IID_CATIIniSettingManagment,
                                                               (void**) &pIMgtAtForCtrl );
                        if ( SUCCEEDED(rc) )
                        {
                           // 首次提交,用于回滚初始化
                           pIMgtAtForCtrl->Commit() ;                      

                           // 释放接口指针
                           pIMgtAtForCtrl->Release();
                           pIMgtAtForCtrl = NULL;

                           // 清理控制器持有该唯一实例
                           _CleanerCtrl.SetController(SettingController);

                           // 将实例返回给调用方
                           *oCtrl = SettingController ;
                           Init = TRUE ;
                        }

                     }
                     pISettingAtForCtrl->Release();
                     pISettingAtForCtrl = NULL ;
                  }

                  // 初始化失败,释放新建的实例
                  if ( FALSE == Init )
                  {
                     SettingController->Release() ;
                     SettingController = NULL ;
                  }
               }
           }else  
           {
              // 实例已存在,直接返回
              *oCtrl = (CAACafGeometryEltSettingCtrl *) pCtrl ;
           }
                
        }else rc = E_FAIL ; // 输出参数指针为空,返回失败

        return rc ;
}
本方法的作用是返回指向 CAACafGeometryEltSettingCtrl 类的指针。该唯一实例指针保存在 _CleanerCtrl 成员变量中。
在通过 SetController 方法将新建控制器存入 _CleanerCtrl 前,必须先执行以下两个方法:
  •     CAAICafGeometryEltSettingAtt 接口的 Initialize(初始化) 方法
  •     CATIIniSettingManagment 接口的 Commit(提交) 方法

实现 CAAICafGeometryEltSettingAtt 接口

实现类为 CAAECafGeometryEltSettingCtrl 类。
  1. 头文件

以下是 CAAECafGeometryEltSettingCtrl 的头文件:
 
#include "CATBaseUnknown.h"
class CATSettingRepository ;  // 配置项仓库类前向声明

#include "CAAICafGeometryEltSettingAtt.h"
// 实现几何图元配置属性访问接口的扩展类
class CAAECafGeometryEltSettingAtt: public CATBaseUnknown
{
  CATDeclareClass;  // CAA宏:声明该类为组件类

  public:

    CAAECafGeometryEltSettingAtt();                 // 构造函数
    virtual ~CAAECafGeometryEltSettingAtt();         // 虚析构函数

    virtual  HRESULT   Initialize() ;                // 初始化方法

    // 图元标识符显示状态:获取、设置、获取配置锁信息
    virtual  HRESULT   GetIdentifierVisibility(CATString & oIdVisibility)   ;
    virtual  HRESULT   SetIdentifierVisibility(const CATString & iIdVisibility)  ;
    virtual  HRESULT   GetInfoIdentifierVisibility(CATSettingInfo * oInfo)  ;

    // 曲线离散最大点数:获取、设置、获取配置锁信息
    virtual  HRESULT   GetMaxPointCurve(int & oMaxPoint)       ;
    virtual  HRESULT   SetMaxPointCurve(const int iMaxPoint)  ;
    virtual  HRESULT   GetInfoMaxPointCurve(CATSettingInfo ** oInfoArray, int * oNbSettingInfo)  ;

    // 隐含点显示状态:获取、设置、获取配置锁信息
    virtual  HRESULT   GetImplPointVisibility(CATString & oImplPointVisibility)        ;
    virtual  HRESULT   SetImplPointVisibility(const CATString & iImplPointVisibility)  ;
    virtual  HRESULT   GetInfoImplPointVisibility(CATSettingInfo * oInfo)  ;

  private:
    // 禁用拷贝构造函数与赋值运算符,防止对象拷贝
    CAAECafGeometryEltSettingAtt(const CAAECafGeometryEltSettingAtt &iObjectToCopy);
    CAAECafGeometryEltSettingAtt & operator = (const CAAECafGeometryEltSettingAtt &iObjectToCopy);

  private:
    CATSettingRepository *   _pSettingRep     ;  // 配置仓库指针,用于读写配置参数
};
#endif
CAAECafGeometryEltSettingAtt 这个 C++ 类继承自 CATBaseUnknown。CATDeclareClass 宏用于声明该类属于一个组件。拷贝构造函数和赋值运算符 = 被声明为私有成员,以避免编译器自动将其生成为公有成员。
除构造函数和析构函数外,所有公有方法均为 CAAICafGeometryEltSettingAtt 接口中定义的方法。
在私有数据成员部分,_pSettingRep 是指向 CATSettingRepository(配置仓库)[5] 的指针,用于访问配置文件的各项属性。
  1. 源文件
以下是 CAAECafGeometryEltSettingAtt 的源文件:
  • 该类是设置控制器 CAACafGeometryEltSettingCtrl 的数据扩展类。
    #include "CAAECafGeometryEltSettingAtt.h"
    #include "CATString.h"
    #include "CATSettingRepository.h"

    #include "TIE_CAAICafGeometryEltSettingAtt.h"
    TIE_CAAICafGeometryEltSettingAtt(CAAECafGeometryEltSettingAtt);

    CATImplementClass(CAAECafGeometryEltSettingAtt,
                      DataExtension,
                      CATBaseUnknown,
                      CAACafGeometryEltSettingCtrl);

    ...
    借助 TIE_CAAICafGeometryEltSettingAtt 宏,CAAECafGeometryEltSettingAtt 类声明其实现了 CAAICafGeometryEltSettingAtt 接口。该扩展类专用于控制器组件。CATImplementClass 宏通过关键字 DataExtension(数据扩展),声明 CAAECafGeometryEltSettingAtt 类为数据扩展类,且该类扩展了主类为 CAACafGeometryEltSettingCtrl 的组件。第三个参数必须始终设为 CATBaseUnknown(该参数未实际使用)。
  • 构造函数 - 析构函数
    CAAECafGeometryEltSettingAtt::CAAECafGeometryEltSettingAtt():_pSettingRep(NULL)
    {
       // 获取名称为 CAACafGeometryElt 的配置仓库实例
       _pSettingRep = CATSettingRepository::GetRepository("CAACafGeometryElt") ;
    }

    CAAECafGeometryEltSettingAtt::~CAAECafGeometryEltSettingAtt()
    {
       // 将配置仓库指针置空
       _pSettingRep = NULL ;
    }
    在构造函数中,获取用于访问 CAACafGeometryElt.CATSetting 配置文件的配置仓库指针。
    在析构函数中,将该指针置为 NULL。无需对该指针调用 Release 释放,系统框架已负责管理这类对象的生命周期。
  • Initialize 方法
    HRESULT CAAECafGeometryEltSettingAtt::Initialize()
    {
      HRESULT rc = S_OK ;          // 定义返回码,初始化为执行成功
      HRESULT rctemp = E_FAIL ;     // 临时返回码,初始化为执行失败

      CATString ident ;
      // 获取图元标识符的显示状态
      rctemp =  GetIdentifierVisibility(ident);
      if ( FAILED(rctemp) )
          rc = rctemp ;

      // 获取隐含点的显示状态
      rctemp = GetImplPointVisibility(ident);
      if ( FAILED(rctemp) )
          rc = rctemp ;

      int value ;
      // 获取曲线最大点数配置值
      rc = GetMaxPointCurve(value);
      if ( FAILED(rctemp) )
          rc = rctemp ;

      return rc ;
    }
    该方法调用所有的 ** 获取类(Getxxx)** 方法:GetIdentifierVisibility、GetImplPointVisibility 和 GetMaxPointCurve。
    如果任意一次调用失败,该方法就返回对应的临时错误码 rctemp。
    必须调用每一个获取类方法,以此确保在这些方法中定义的默认值能够被初始化并写入配置仓库。
  • GetIdentifierVisibility 方法
    HRESULT   CAAECafGeometryEltSettingAtt::GetIdentifierVisibility(
                                            CATString & oIdVisibility)  
    {
      HRESULT rc = E_FAIL ;

      if ( NULL != _pSettingRep )
      {
         CATString Ident("IdHide");
         long flag = _pSettingRep->ReadSetting("Identifier",&Ident);
         if ( 1 == flag )
         {
             oIdVisibility = Ident ;
             rc = S_OK;
         }
      }
      return rc ;
    }
    该方法的作用是返回标识符的显示方式相关信息。该信息存储在配置仓库的 Identifier(标识符) 属性下。
    调用 CATSettingRepository 类的 ReadSetting 方法,并将 Identifier 作为第一个参数,即可读取配置仓库中当前存储的对应信息。
    变量 Ident 被初始化为默认值。当不存在管理员配置文件时,该默认值即为重置后的取值。
  • SetIdentifierVisibility 方法
    // 设置图元标识符的显示状态
    HRESULT   CAAECafGeometryEltSettingAtt::SetIdentifierVisibility(
                                            const CATString & iIdVisibility)
    {
      HRESULT rc = E_FAIL ;  // 初始化返回状态为失败

      // 定义三种合法显示状态
      CATString StIdHide("IdHide");          // 隐藏标识符
      CATString StIdShow("IdShow");          // 显示标识符
      CATString StIdPreSelectShow("IdPreSelectShow"); // 预选时显示标识符

      // 校验传入值是否为允许的状态
      if ( (StIdHide == iIdVisibility) ||
           (StIdShow == iIdVisibility) ||
           (StIdPreSelectShow == iIdVisibility) )
      {
         if ( NULL != _pSettingRep )  // 配置仓库指针有效
         {
             CATString Ident = iIdVisibility ;

             // 将配置值写入配置仓库的 Identifier 项
             long flag = _pSettingRep->WriteSetting("Identifier",&Ident);
             if ( 1 == flag )  // 写入成功
             {
                rc = S_OK;
             }
         }
      }
      return rc ;
    }
    该方法用于修改标识符的显示方式相关信息。该信息存储在配置仓库的 Identifier(标识符) 属性下。调用 CATSettingRepository 类的 WriteSetting 方法,并将 Identifier 作为第一个参数,即可修改该配置信息。在写入配置仓库前会校验输入数据的合法性(若第一个参数为枚举类型,则无需校验)。
  • GetInfoIdentifierVisibility 方法
    // 获取标识符显示状态的配置信息
    HRESULT   CAAECafGeometryEltSettingAtt::GetInfoIdentifierVisibility(
                                               CATSettingInfo * oInfo,int iFlag )  
    {                                                                         
      HRESULT rc = E_FAIL ;  // 初始化返回值为失败

      if ( NULL != _pSettingRep )  // 配置仓库指针有效
      {
         // 从配置仓库获取 Identifier 项的配置信息
         long flag = _pSettingRep->GetInfo("Identifier",oInfo, iFlag) ;

         if ( 0 == flag )  // 获取信息成功
         {
            rc = S_OK ;
         }
      }
      return rc ;
    }
    该方法调用 CATSettingRepository 类的 GetInfo 方法,并以 Identifier 作为第一个参数,返回专用于该参数的唯一 CATSettingInfo 对象。
  • GetInfoMaxPointCurve 方法
    // 获取曲线最大点数的配置信息
    HRESULT   CAAECafGeometryEltSettingAtt::GetInfoMaxPointCurve(
                                               CATSettingInfo ** oInfoArray, int *oNbSettingInfo )  
    {
        HRESULT rc = E_FAIL ;  // 初始化返回状态为失败

        // 校验配置仓库指针、输出数组指针、数量指针均有效
        if ( (NULL != _pSettingRep) && ( NULL != oNbSettingInfo) && ( NULL != oInfoArray ) )
        {
           *oNbSettingInfo = 0 ;    // 配置信息数量初始化为0
           *oInfoArray = NULL ;     // 配置信息数组初始化为空

           CATSettingInfo info ;
           // 读取 MaxPointCurve 配置项的元信息
           long flag = _pSettingRep->GetInfo("MaxPointCurve",&info) ;

           if ( 0 == flag )         // 获取信息成功
           {
              *oNbSettingInfo = 1 ;                     // 配置项数量为1
              *oInfoArray = new CATSettingInfo [*oNbSettingInfo] ; // 动态创建数组
              (*oInfoArray)[0] = info ;                 // 存入配置信息

              rc = S_OK ;
           }
        }
        return rc ;
    }
    该方法返回的是CATSettingInfo 数组,而非单个 CATSettingInfo 对象。在本示例中,由于该参数仅由一个属性表示,使用单个 CATSettingInfo 指针就足够。但这里仍提供了 CATSettingInfo 指针数组的示例,以便应对参数由多个属性表示、或不确定内部存储结构未来是否会变更的情况。
  1. 接口字典
    在专用于 CAACATIAApplicationFrm.edu 框架的接口字典中,需要添加如下一行内容,用于声明:
    CAACafGeometryEltSettingCtrl 组件在 CAACafCtrlToolsOptions 模块中实现了 CAAICafGeometryEltSettingAtt 接口。
    CAACafGeometryEltSettingCtrl CAAICafGeometryEltSettingAtt libCAACafCtrlToolsOptions

实现 CATIIniSettingManagment 接口

CATIIniSettingManagment 接口用于管理配置仓库的通用方法。
 
实现该接口的类为 CAAECafSettingManagmentForGeometryElt
  1. 头文件

以下是 CAAECafSettingManagmentForGeometryElt 的头文件:
#include "CATIIniSettingManagment.h"
#include "CATEIniSettingManagment.h"

class CAAECafSettingManagmentForGeometryElt: public CATEIniSettingManagment
{
  CATDeclareClass;

  public:

    CAAECafSettingManagmentForGeometryElt();

    virtual ~CAAECafSettingManagmentForGeometryElt();

  private:

    CAAECafSettingManagmentForGeometryElt(const CAAECafSettingManagmentForGeometryElt &iObjectToCopy);
    CAAECafSettingManagmentForGeometryElt & operator = (const CAAECafSettingManagmentForGeometryElt &iObjectToCopy);

};
CAAECafSettingManagmentForGeometryElt 这个 C++ 类继承自 CATEIniSettingManagment。该适配类定义在 **InteractiveInterfaces(交互界面)** 框架中。
CATDeclareClass 宏用于声明 CAAECafSettingManagmentForGeometryElt 类属于一个组件。
拷贝构造函数与赋值运算符(=)被声明为私有,以此避免编译器自动将其生成为公有成员。
  1. 源文件

以下是 CAAECafSettingManagmentForGeometryElt 的源文件:
#include "CAAECafSettingManagmentForGeometryElt.h"

#include "TIE_CATIIniSettingManagment.h"
TIE_CATIIniSettingManagment(CAAECafSettingManagmentForGeometryElt);

CATImplementClass(CAAECafSettingManagmentForGeometryElt,
                  DataExtension,
                  CATBaseUnknown,
                  CAACafGeometryEltSettingCtrl);

CAAECafSettingManagmentForGeometryElt::CAAECafSettingManagmentForGeometryElt():
                   CATEIniSettingManagment("CAACafGeometryElt")
{
}

CAAECafSettingManagmentForGeometryElt::~CAAECafSettingManagmentForGeometryElt()
{
}
通过 TIE_CATIIniSettingManagment 宏,CAAECafSettingManagmentForGeometryElt 类声明实现了 CATIIniSettingManagment 接口。该扩展类专用于控制器组件。
CATImplementClass 宏通过关键字 DataExtension 声明 CAAECafSettingManagmentForGeometryElt 类为数据扩展类,用于扩展主类为 CAACafGeometryEltSettingCtrl 的组件。第三个参数必须固定设为 CATBaseUnknown,在此处无实际作用。
构造函数调用适配类 CATEIniSettingManagment 的构造函数,传入配置文件名 CAACafGeometryElt,该名称与 CAAECafGeometryEltSettingAtt 构造函数中使用的名称一致。可参考上一步的构造函数‑析构函数小节。
析构函数为空实现。
  1. 接口字典

在专用于 CAACATIAApplicationFrm.edu 框架的接口字典中,需要添加如下一行内容,用于声明:
 
CAACafGeometryEltSettingCtrl 组件在 CAACafCtrlToolsOptions 模块中实现了 CATIIniSettingManagment 接口。
CAACafGeometryEltSettingCtrl CATIIniSettingManagment libCAACafCtrlToolsOptions

创建配置控制器的工厂类

CAACafGeometryEltSettingCtrl 头文件类存放于 LocalInterfaces(本地接口)目录下,因此获取其指针的唯一方式是调用全局公共函数。该函数返回配置控制器组件所实现接口的指针。
  1. 头文件

以下是 GetCAACafGeometryEltSettingCtrl 的头文件:
#include "IUnknown.h"  
#include "CAACafCtrlToolsOptions.h"

// 由 CAACafCtrlToolsOptions 模块导出
HRESULT ExportedByCAACafCtrlToolsOptions
        GetCAACafGeometryEltSettingCtrl(const IID & iInterfaceIdentifier ,
                                        void ** oInterfacePointer) ;
GetCAACafGeometryEltSettingCtrl 全局函数由 CAACafCtrlToolsOptions 模块导出。
  1. 源文件

以下是 GetCAACafGeometryEltSettingCtrl 的源文件:
#include "GetCAACafGeometryEltSettingCtrl.h"
#include "CAACafGeometryEltSettingCtrl.h"    
#include "CATErrorDef.h"

HRESULT GetCAACafGeometryEltSettingCtrl(const IID & iInterfaceIdentifier,
                                       void     ** oInterfacePointer)
{
   HRESULT rc = S_OK ;

   if ( NULL != oInterfacePointer )
   {
       CAACafGeometryEltSettingCtrl * pCtrl = NULL ;
       // 获取配置控制器实例
       rc = ::CAACafGeometryEltSettingCtrl::GetSettingController(&pCtrl);
       if ( SUCCEEDED(rc) && ( NULL != pCtrl) )
       {
         // 查询所需接口
         rc = pCtrl->QueryInterface(iInterfaceIdentifier,oInterfacePointer);
 
         pCtrl->Release();
         pCtrl= NULL ;
       }
       else
       {
           rc = E_FAIL ;
       }
   }else rc = E_FAIL ;

   return rc ;
}
调用 CAACafGeometryEltSettingCtrl 类的 GetSettingController 方法,获取该类的唯一实例指针。随后针对传入的接口标识调用 QueryInterface,从而获取所需的接口指针。
小结
本示例演示了如何通过创建以下内容来实现配置控制器:
  1.     用于管理配置文件中各项参数的接口;
  2.     配置控制器的主组件类,该类实现:
    • 上述自定义接口
    • 定义在 InteractiveInterfaces 框架中的 CATIIniSettingManagment 接口
  1.     用于获取该配置控制器接口指针的全局函数。

 

References

 

[1] The Setting Controller
[3] Creating a Property Page for Application Properties
[4] About Globally Unique IDentifiers
[5] Object Modeler Component and Implementation Inheritances
[6] Setting Repositories and Attributes

 

 
posted @ 2026-05-26 14:56  Breadss  阅读(3)  评论(0)    收藏  举报