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的赋值方法:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!