文章目录
-
- 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和HRESULT
?? 。 STDMETHOD_它是定义指定返回类型的接口方法的宏,包括virtual关键字。可用于定义方法声明。 。例如: STDMETHOD_ (ULONG, release)()展开后就是 virtual ULONG STDMETHODCALLTYPE release() STDMETHODCALLTYPE 宏展开是 __stdcall。 STDMETHOD它还用于定义指定返回类型的接口方法,包括virtual关键字。 ?? ??HRESULT值包含以下字段:指示严重程度 1 位代码,零表示成功,1 代表失败。4 保留值 位代码,指示错误或警告,也称为设施代码的责任。 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 *rgvar;
/* [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;
合理的脚本代码可以有效的提高工作效率,减少重复劳动。