Austin的博客

1、智能指针CComPtr

ATL的CComPtr模板类提供了基本的智能指针功能。你可以把CComPtr类作为一个COM接口指针来使用,当类超出他的有效范围时,,他将自动调用Release()CComPtr<IMath> ptrMath;HRESULT hr;ht = CoCreateInstance(CLSID_Math,NULL,CLSCTX_LOCAL_SERVER,IDD_IMath,(void**)&prtMath);long lResult;ptrMath->Add(1, 2, &lResult);</span>…

2、CComQIPtr

该指针在被实例化后自动调用QueryInterface ,所以他还需要另外一个参数—所请求的接口IID。下面代码说明如何使用:

CComQIPtr<IAdvancedMath, &IDD_IAdvancedMath> ptrAdvancedMath(ptrMath);if(ptrAdvancedMath){ptrAdvancedMath->Factorial(12, &lResult);}3、BSTR

他被声明为OLECHAR *,说明他是一个Unicode字符串,他的最前面有个字符串长度(DWORD)。通过调用SysAllocString函数来申请字符串,释放时需要调用SysFreeString。

4、VARIANT

变体类型VARIANT,能够在运行期间动态的改变类型。变体类型能支持所有简单的数据类型,如整型、浮点、字符串、布尔型、日期时间、货币及OLE对象等。他即包含了数据本身,还包含数据的类型。

对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY。

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 tagVARIANT VARIANT;下面一个简单例子:

VARIANT var;VariantInit(&var);var.vt = VT_I4;var.lVal = 1045;

常用处理VARIANT类型的API有:

VariantInit

VariantClear

VariantChangeType

VariantCopy

5、CComBSTR类和CComVariant类

这两个类是对上面的数据类型做封装,提供一些成员函数,方便操作。

CComVariant类包含以下成员函数:

CComVariant(…)

ChangeType

Clear

Copy

ReadFromStream

WriteToStream

=

==

6、SafeArray数据类型

安全数组类型的定义:

typedef struct tagSAFEARRAY{USHORT cDims;USHORT fFeatures;ULONG cbElements;ULONG cLocks;PVOID pvData;SAFEARRAYBOUND rgsabound[ 1 ];} SAFEARRAY; typedef struct tagSAFEARRAYBOUND{ULONG cElements;LONG lLbound;} SAFEARRAYBOUND;

当你使用SafeArray时,不能直接访问他的数据成员,应使用相应的API函数:

SafeArrayCreate

SafeArrayDestory

SafeArrayGetElement

SafeArrayPutElement

SafeArrayGetLBound

SafeArrayGetUBound

旁观者的姓名永远爬不到比赛的计分板上。

Austin的博客

相关文章:

你感兴趣的文章:

标签云: