SAFEARRAY * *类型比较复杂,不像其他类型可以直接传入Fire事件方法里。
先看基本类型参数处理方法:举例LONG型
HRESULT Fire_CloseCompleted(LONG MethodID)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[0] = MethodID;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x60010003, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;
}
蓝色字体是与参数相关语句。
再看SAFEARRAY * *类型的处理方法:
HRESULT Fire_MessageReceived(SAFEARRAY * * Message)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[0].vt = VT_ARRAY | VT_BYREF | VT_UI1; //参数类型
pvars[0].pparray = Message; //参数值
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x60010008, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;
}
分享到:
相关推荐
1. **创建SafeArray** 创建SafeArray通常通过`SafeArrayCreate`函数完成,需要指定数组的维度、每维的大小以及元素的数据类型。 2. **填充SafeArray** 可以使用`SafeArrayPutElement`函数将元素放入数组中,或者...
1. **创建SafeArray** - `SafeArrayCreate` 用于创建多维普通数组,支持各种基础数据类型。 - `SafeArrayCreateEx` 用于创建包含自定义类型或接口指针的多维数组。 - `SafeArrayCreateVector` 创建一维普通数组,...
1. **创建SafeArray**:使用`SafeArrayCreate`函数创建一个新的SafeArray,指定元素类型(例如,VT_UI1表示无符号字节,适合二进制数据)和数组尺寸。 2. **填充数据**:通过`SafeArrayAccessData`获取指向实际数据...
本话题主要聚焦于如何在VC(Visual C++)中编写OCX控件,并在VB(Visual Basic)中进行调用,特别是涉及到 Variant 输入/输出参数、通过 OCX 传递字节数组以及 SafeArray 的使用方法。 1. Variant 输入/输出参数: ...
需要做以下几点: 1. 继承`public IDispEventSimpleImpl,CWpsAddins,&__uuidof(KSO::_CommandBarButtonEvents)>` 2. 声明`_ATL_FUNC_INFO OnClickButtonInfo ={CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_...
在VB中调用COM接口时,SafeArray常被用于传递参数,特别是当接口方法需要数组作为输入或返回值时。例如,Excel的VBA接口经常使用SafeArray来处理工作表的范围数据。 `ocx.txt`可能包含关于使用OCX(ActiveX控件)与...
在实际应用中,`SAFEARRAY`常用于自动化对象(Automation Objects)的参数传递,例如在Office VBA和外部程序(如C++或VB.NET)之间的交互。此外,`SAFEARRAY`也广泛应用于ActiveX控件和COM服务器。 为了更好地理解...
SAFEARRAY* psa = SafeArrayCreate(vt, 1, &sabound); // 创建数组 ``` ### 操作`SAFEARRAY` 一旦创建了`SAFEARRAY`,可以使用一系列的API来访问和修改其内容,如`SafeArrayGetElement`用于获取指定索引的元素,`...
《VB指针葵花宝典之SafeArray》是关于Visual Basic编程中处理数组的一个重要主题。SafeArray是一种在Microsoft的COM(Component Object Model)技术中用于安全高效地管理数组的数据结构。它尤其在处理变体类型...
在COM(Component Object Model)中,`SafeArray`是一种特殊的数据结构,用于安全地存储和管理数组,尤其在跨进程通信或对象间的数据传递时。`SafeArray`提供了类型安全和边界检查,确保了数据访问的可靠性和一致性...
1. **创建SafeArray**: - 首先定义VARIANT变量和SAFEARRAY结构体。 - 使用`SafeArrayCreate`函数创建SafeArray,指定元素类型(例如`VT_UI1`表示无符号字节)和维数。`SAFEARRAYBOUND`结构体用来设置数组的边界和...
SafeArray的使用通常涉及到以下几个关键点: - 创建:使用`SafeArrayCreate`函数创建一个空的SafeArray,指定数组的维度、类型和其他属性。 - 填充:使用`SafeArrayPutElement`函数将数据放入数组的特定位置。 - ...
比如三层架构中通常需要将使用的ClientDataSet数据集传出,那么就可以将DataSet转换为SafeArray,再由其他模块转换接收。 ===============================================================================
bool RunProcedure(LPCTSTR szProcName, SAFEARRAY** saParameters, VARIANT* varRet); //protected: void CommonConstruct(); bool GetMethodsName(); LPCTSTR GetScriptFunction(LPCTSTR name);
3. **SAFEARRAY**: SAFEARRAY是COM中用于表示数组的数据结构,它可以包含不同类型的元素,包括字符串。SAFEARRAY可以动态调整大小,具有边界检查,并支持多维数组。处理SAFEARRAY时,你需要使用SafeArrayCreate、...
对于二进制数据的交换必须使用Variant类型,但是在实际使用过程中使用VC2008ActiveX项目向导生成的ocx触发事件中带有Variant类型的参数时,ocx控件在触发事件消息之后就会出现内存异常,导致程序无法正常运行,而...
使用SafeArray对Excel导入/导出(区域读写数据),比使用单元格循环读写速度快上一百倍以上,经过测试整个工作表65526*10的数据区域,导入时间与导出时间就35秒钟左右,速度上与读写普通的文本文件有得比,基本能让人满意....
- **填充和传递SAFEARRAY**: 将UDT对象放入SAFEARRAY,然后在接口方法中将这个数组传递给调用者。 - **接收和解码SAFEARRAY**: 在接收端,需要解析SAFEARRAY,提取其中的UDT对象,并进行适当的处理。 **4. ATL支持*...
SAFEARRAY** SAFEARRAY是一种在COM中表示数组的数据结构,尤其适用于跨进程边界传递数组数据。在MFC WinSock ActiveX控件中,SAFEARRAY可用于封装多维数组或复杂数据类型的集合,如传递字节缓冲区进行网络通信。...
《VB指针葵花宝典之SafeArray》深入解析 VB中的指针操作一直以来都是一个让人又爱又恨的话题。虽然指针可以显著提升数组操作的效率,但是使用CopyMemory等函数进行字节级操作的繁琐性和潜在的风险,使得VB中的指针...