- 1.tlb文件
- 2.volatile
- 3.STDMETHOD和HRESULT
- 4.STDMETHODIMP
- 5.DISPID
- 6.REFIID
- 7.LCID
- 8.DISPPARAMS
- 9.VARIANT
- 10.EXCEPINFO
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和HRESULTSTDMETHOD:定义了一个返回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.STDMETHODIMPSTDMETHODIMP是一个宏,#define STDMETHODIMP HRESULT STDMETHODCALLTYPE。标准调用约定返回。
5.DISPIDtypedef 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.LCIDtypedef 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;
合理的脚本代码可以有效的提高工作效率,减少重复劳动。