您当前的位置: 首页 >  c++

插件开发

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

COM组件-接口-对象-C++的区别-关键术语-tlb文件-volatile-STDMETHOD-REFIID-DISPID

插件开发 发布时间:2022-05-27 15:44:54 ,浏览量:1

文章目录
    • 1.tlb文件
    • 2.volatile
    • 3.STDMETHOD和HRESULT
    • 4.STDMETHODIMP
    • 5.DISPID
    • 6.REFIID
    • 7.LCID
    • 8.DISPPARAMS
    • 9.VARIANT
    • 10.EXCEPINFO
  COM组件,是二进制级别的模块复用,所以编写COM组件有许多的概念需要了解。为了达到模块复用,必须将调用接口规范化,这样不同语言调用该二进制模块时,只要按照标准就能复用该模块。

  COM接口通常是一组函数的逻辑集合,继承IUnKnown接口。COM对象可以提供多个COM接口,每个接口提供不同的服务,因此COM接口与COM对象一样,都是用GUID来标识的,客户通过GUID来获取接口指针,再通过接口指针获取对应的服务。

  为了调用Com库,需要了解com库的涉及一些文件如tlb文件、涉及的术语。

1.tlb文件

  它是com类型库文件。在需要使用对应com类的模块里,“#import …*.tlb”使用之。vc++编译器解析tlb文件生成的标准c++文件tlh、tli文件。tlh相当于类型申明(头文件),tli相当于定义实现(CPP文件)。里面详细描述了接口和类声明和GUID值。

2.volatile

  当要求使用 volatile 声明的变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。volatile 指出 变量i 是随时可能发生变化的,每次使用它的时候必须从 i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。

3.STDMETHOD和HRESULT

   STDMETHOD:定义了一个返回HRESULT类型的虚方法。 STDMETHOD_是一个宏,用于定义指定返回类型的接口方法,包含virtual关键字。可用于定义方法声明。 #define STDMETHOD_(type,menthod) virtual type STDMETHODCALLTYPE menthod。例如: STDMETHOD_ (ULONG, release)()展开后就是 virtual ULONG STDMETHODCALLTYPE release() STDMETHODCALLTYPE 宏展开是 __stdcall。 STDMETHOD也是一个宏,用于定义指定返回类型的接口方法,包含virtual关键字。#define STDMETHOD(method) virtual COM_DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE method   HRESULT:一个 32 位值,用来描述错误或警告。   HRESULT值包含以下字段:指示严重级别 1 位代码,其中零表示成功,1 代表失败。4 位保留的值。11 位代码,指示错误或警告,也称为设施代码的责任。一个 16 位代码描述该错误或警告。

4.STDMETHODIMP

   STDMETHODIMP是一个宏,#define STDMETHODIMP HRESULT STDMETHODCALLTYPE。标准调用约定返回。

5.DISPID
typedef LONG DISPID;

   This data type is used by IDispatch::Invoke to identify methods, properties, and arguments.

6.REFIID
#define REFIID const IID &
typedef GUID IID;
typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;

   GUID; 共有16个字节,所以不宜传变量进去,最好是传指针或引用。但是出于指针的危险性,所以使用常量的引用。

7.LCID
typedef DWORD LCID;

   区域设置 ID (LCID) 表。Indicates that the parameter is a locale ID (LCID).

8.DISPPARAMS

   传给被调用函数的参数。

typedef struct tagDISPPARAMS
    {
    /* [size_is] */ VARIANTARG *rgvarg;
    /* [size_is] */ DISPID *rgdispidNamedArgs;
    UINT cArgs;
    UINT cNamedArgs;
    } 	DISPPARAMS;
9.VARIANT

   Variant 是一种特殊的数据类型,除了定长 String 数据及用户定义类型外,可以包含任何种类的数据。Variant 也可以包含 Empty、Error、Nothing 及 Null等特殊值。可以用 VarType 函数或 TypeName 函数来决定如何处理 Variant 中的数据。变体类型Variant,能够在运行期间动态的改变类型。变体类型能支持所有简单的数据类型,如整型、浮点、字符串、布尔型、日期时间、货币及OLE自动化对象等,不能够表达Object Pascal对象。

typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;

struct tagVARIANT
    {
    union 
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                _VARIANT_BOOL *pbool;
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    } 	__VARIANT_NAME_4;
                } 	__VARIANT_NAME_3;
            } 	__VARIANT_NAME_2;
        DECIMAL decVal;
        } 	__VARIANT_NAME_1;
    } ;
typedef VARIANT *LPVARIANT;

typedef VARIANT VARIANTARG;

typedef VARIANT *LPVARIANTARG;
10.EXCEPINFO

   描述在 IDispatch::Invoke 过程中发生的异常。

typedef struct tagEXCEPINFO {
    WORD  wCode;
    WORD  wReserved;
    BSTR  bstrSource;
    BSTR  bstrDescription;
    BSTR  bstrHelpFile;
    DWORD dwHelpContext;
    PVOID pvReserved;
    HRESULT (__stdcall *pfnDeferredFillIn)(struct tagEXCEPINFO *);
    SCODE scode;
} EXCEPINFO, * LPEXCEPINFO;

  合理的脚本代码可以有效的提高工作效率,减少重复劳动。

关注
打赏
1665481431
查看更多评论
立即登录/注册

微信扫码登录

0.0382s