计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

C++类的动态组件化技术(6)

2013-10-19 01:11
导读:3. C++参数类型的自动化包装 在本文的技术方案中,C++类的public方法与ATL组件接口中的方法一一对应;相应的,C++类中方法的参数类型也要转换为COM规范所

  3.   C++参数类型的自动化包装

  在本文的技术方案中,C++类的public方法与ATL组件接口中的方法一一对应;相应的,C++类中方法的参数类型也要转换为COM规范所允许的数据类型。

  在基于COM的自动化(Automation)技术中,Microsoft提供了一套自动化兼容的数据类型VARIANT,定义如下:

  typedef struct FARSTRUCT tagVARIANT VARIANT;

  typedef struct FARSTRUCT tagVARIANT VARIANTARG;

  typedef struct tagVARIANT {

       VARTYPE                        vt;

       unsigned short                  wReserved1;

       unsigned short                  wReserved2;

       unsigned short                  wReserved3;

       union {

              Byte                         bVal;                               // VT_UI1.

              Short                        iVal;                                // VT_I2.

              long                          lVal;                                // VT_I4.

              float                         fltVal;                              // VT_R4.

              double                      dblVal;                            // VT_R8.

              VARIANT_BOOL      boolVal;                           // VT_BOOL.

              SCODE                    scode;                            // VT_ERROR.

              CY                           cyVal;                             // VT_CY.

              DATE                       date;                               // VT_DATE.

              BSTR                       bstrVal;                           // VT_BSTR.

              DECIMAL                FAR* pdecVal;                 // VT_BYREF|VT_DECIMAL.

              IUnknown                 FAR* punkVal;                 // VT_UNKNOWN.

              IDispatch                  FAR* pdispVal;                // VT_DISPATCH.

              SAFEARRAY            FAR* parray;                   // VT_ARRAY|*.

              Byte                         FAR* pbVal;                    // VT_BYREF|VT_UI1.

              short                        FAR* piVal;                     // VT_BYREF|VT_I2.

              long                          FAR* plVal;                     // VT_BYREF|VT_I4.

              float                         FAR* pfltVal;                   // VT_BYREF|VT_R4.

              double                      FAR* pdblVal;                  // VT_BYREF|VT_R8.

              VARIANT_BOOL      FAR* pboolVal;                // VT_BYREF|VT_BOOL.

              SCODE                    FAR* pscode;                  // VT_BYREF|VT_ERROR.

              CY                           FAR* pcyVal;                  // VT_BYREF|VT_CY.

              DATE                       FAR* pdate;                    // VT_BYREF|VT_DATE.

              BSTR                       FAR* pbstrVal;                // VT_BYREF|VT_BSTR.

              IUnknown                 FAR* FAR* ppunkVal;      // VT_BYREF|VT_UNKNOWN.

              IDispatch                  FAR* FAR* ppdispVal;     // VT_BYREF|VT_DISPATCH.

              SAFEARRAY            FAR* FAR* pparray         // VT_ARRAY|*.

              VARIANT                 FAR* pvarVal;                 // VT_BYREF|VT_VARIANT.

              void                          FAR* byref;                    // Generic ByRef.

              char                         cVal;                               // VT_I1.

              unsigned short           uiVal;                              // VT_UI2.

              unsigned long            ulVal;                              // VT_UI4.

              int                            intVal;                             // VT_INT.

              unsigned int               uintVal;                           // VT_UINT.

              char FAR *               pcVal;                             // VT_BYREF|VT_I1.

              unsigned short FAR * puiVal;                            // VT_BYREF|VT_UI2.

              unsigned long FAR *  pulVal;                            // VT_BYREF|VT_UI4.

              int FAR *                  pintVal;                           // VT_BYREF|VT_INT.

              unsigned int FAR *     puintVal;                          // VT_BYREF|VT_UINT.

       };

};

  我们看到,所有简单数据类型都可以在VARIANT中找到对应的定义,但是,在多数的基于C++的系统设计中,方法参数不会仅仅出现简单数据类型,类对象、对象引用、对象指针被频繁的作为参数来传递。

  以类对象、对象引用或对象指针形式存在的参数,我们称为复杂类型参数。在技术方案中,所有复杂类型参数在ATL接口方法中一律对应接口指针,我们需要提供C++对象(或引用、指针)和ATL接口指针之间的动态转换功能。下文就复杂类型作为传入、传出参数分别进行讨论。

上一篇:家庭自动化系统 下一篇:没有了