COM组件笔记(三)

一、IDispatch的简介和作用

  • IDispatch中最令人感兴趣的两个函数是GetIDsOfNames和Invoke。
  • GetIDsOfNames函数将读取一个函数名称,并返回其调度ID。
  • Invoke函数接收一个调度ID,跟函数参数,执行调度ID所对应的函数的功能。
  • 所以,解释性语言跟宏语言不必直接认识我们的自定义接口,只需要我们的COM组件支持了IDispatch接口,它们就能通过自动化控制程调用我们的IDispatch接口,通过传入函数名字的字符串,跟函数参数来执行调用我们的自定义接口

二、常用的COM数据类型

  • CHAR:    typedef char CHAR;
  • CHAR*:     CHAR的指针;
  • BYTE:     typedef unsigned char BYTE;
  • BYTE*:      BYTE的指针;
  • SHORT:           typedef short SHORT;
  • SHORT*:       SHORT的指针;
  • USHORT:      typedef unsigned short USHORT;
  • USHORT*:       USHORT的指针;

 

  •      

 

  •        

 

  • BSTR

    

 

 

     错误的赋值:BSTR bstr = L"Hello UIPower"。之所以错误,是因为这样子的字符串前面没有计数

    • BSTR SysAllocString(const OLECHAR*)是COM中申请BSTR字符串的方法。
    • BSTR SysAllocStringLen(const OLECHAR*,UINT)据根字符串指针与字符个数构造BSTR字符串。
    • UINT SysStringLen(BSTR)获取字符串前面的计数值。
    • void SysFreeString(BSTR)释放字符串,当COM中的字符串(BSTR)不再使用时,调用该函数。
1 // BSTR声明示例
2 
3 BSTR bstrA = SysAllocString(L"Hello BSTR");
4 
5 BSTR bstrB = SysAllocStringLen(bstrA, SysStringLen(bstrA));
6 
7 SysFreeString(bstrA);
8 
9 SysFreeString(bstrB):

 

  • IUnknown,IDispatch

               

 

  • VARIANT的初始化与清除,VARIANT可以说是COM组件中的万能类型,它是一个结构体,可以定义为很多数据类型
    VARIANT var;
    VariantInit(&var);
    
    // 此时 var.vt == VT_EMPTY
    
    // 其他操作...
    VariantClear(&var);

    以下是用VARIANT保存LONG类型

VARIANT var;
VariantInit(&var);

var.vt = VT_l4;
var.lVal = 100;
VariantClear(&var);

/*
查看VARIANT结构体定义之前的注释可以查看到VTI4与数据类型的对应关系,同时也可以查看到VT_I2,VT_R4等与相应数据类型的对应关系。
*/

         以下是用VARIANT保存FLOAT类型

VARINAT var;
VariantInit(&var);

var.vt = VT_R4;
var.fltVal = 1.23f;
VariantClear(&var);

       以下是用VARIANT保存BSTR类型

VARIANT var;
VariantInit(&var);

var.vt = VT_BSTR;
var.bstrVal = SysAllocString(L"Hello UIPower");
VariantClear(&var);

  以下是用VARIANT保存BOOL类型

VARIANT var;
VariantInit(&var);

var.vt = VT_BOOL;
var.boolVal = VARIANT_FALSE;
VariantClear(&var);

      以下是从VARIANT中读取相应类型的值

// 读取long型
if(var.vt == VT_l4)
{
     long lValue = var.lVal;
}

// 读取float型
if(var.vt == VT_R4)
{
     float fValue = var.fltVal;
}

// 读取BSTR型
if(var.vt == VT_BSTR)
{
     BSTR bstrValue = var.bstrVal;
}

// 读取BOOL型
if(var.vt == VT_BOOL)
{
     VARIANT_BOOL varbValue = var.boolVal;
}

 

三、COM数据类型转换

  以下示例将LONG类型转换为FLOAT类型:

VARIANT var;
VariantInit(&var);

var.vt = VT_l4
var.lVal = 100;

VariantChangeType(&var, &var, 0, VT_R4);

if(var.vt == VT_R4){
        FLOAT fValue = var.fltVal;
}

VariantClear(&var);

以下示例将LONG类型转换为BSTR类型:

VARIANT var;
VariantInit(&var);

var.vt = VT_l4;
var.lVal = 100;

VariantChangeType(&var, &var, 0, VT_BSTR);

if(var.vt == VT_BSTR)
{
       BSTR fValue = var.bstrVal;
}

VariantClear(&var);

 

四、基于VARIANT的派生类

以下是CComVariant的构造方法:

 

 以下是CComVariant的赋值方法:

 

posted @ 2022-06-24 12:56  炫迈吃到爽  阅读(150)  评论(0编辑  收藏  举报