`
touchinsert
  • 浏览: 1340605 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

COM的连接点的Fire事件如何传出SAFEARRAY * * Message参数

 
阅读更多

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;

}

分享到:
评论

相关推荐

    Com_SafeArray 使用实例

    1. **创建SafeArray** 创建SafeArray通常通过`SafeArrayCreate`函数完成,需要指定数组的维度、每维的大小以及元素的数据类型。 2. **填充SafeArray** 可以使用`SafeArrayPutElement`函数将元素放入数组中,或者...

    SafeArray使用.doc

    1. **创建SafeArray** - `SafeArrayCreate` 用于创建多维普通数组,支持各种基础数据类型。 - `SafeArrayCreateEx` 用于创建包含自定义类型或接口指针的多维数组。 - `SafeArrayCreateVector` 创建一维普通数组,...

    safearray-2.zip_SafeArray

    1. **创建SafeArray**:使用`SafeArrayCreate`函数创建一个新的SafeArray,指定元素类型(例如,VT_UI1表示无符号字节,适合二进制数据)和数组尺寸。 2. **填充数据**:通过`SafeArrayAccessData`获取指向实际数据...

    Variant输入出参数,ocx传递byte数组,safearray使用方法,vc写ocx在vb下调用

    本话题主要聚焦于如何在VC(Visual C++)中编写OCX控件,并在VB(Visual Basic)中进行调用,特别是涉及到 Variant 输入/输出参数、通过 OCX 传递字节数组以及 SafeArray 的使用方法。 1. Variant 输入/输出参数: ...

    如何编写WPS的Com加载项

    需要做以下几点: 1. 继承`public IDispEventSimpleImpl,CWpsAddins,&__uuidof(KSO::_CommandBarButtonEvents)&gt;` 2. 声明`_ATL_FUNC_INFO OnClickButtonInfo ={CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_...

    vb safearray

    在VB中调用COM接口时,SafeArray常被用于传递参数,特别是当接口方法需要数组作为输入或返回值时。例如,Excel的VBA接口经常使用SafeArray来处理工作表的范围数据。 `ocx.txt`可能包含关于使用OCX(ActiveX控件)与...

    _SAFEARRAY_User_SafeArray_

    在实际应用中,`SAFEARRAY`常用于自动化对象(Automation Objects)的参数传递,例如在Office VBA和外部程序(如C++或VB.NET)之间的交互。此外,`SAFEARRAY`也广泛应用于ActiveX控件和COM服务器。 为了更好地理解...

    SAFEARRAY代码实例

    SAFEARRAY* psa = SafeArrayCreate(vt, 1, &sabound); // 创建数组 ``` ### 操作`SAFEARRAY` 一旦创建了`SAFEARRAY`,可以使用一系列的API来访问和修改其内容,如`SafeArrayGetElement`用于获取指定索引的元素,`...

    8012_SafeArray(VB指针葵花宝典之SafeArray).zip_SafeArray _arrayvb

    《VB指针葵花宝典之SafeArray》是关于Visual Basic编程中处理数组的一个重要主题。SafeArray是一种在Microsoft的COM(Component Object Model)技术中用于安全高效地管理数组的数据结构。它尤其在处理变体类型...

    在COM中使用数组_code.zip_COM_SafeArray _字符串数组

    在COM(Component Object Model)中,`SafeArray`是一种特殊的数据结构,用于安全地存储和管理数组,尤其在跨进程通信或对象间的数据传递时。`SafeArray`提供了类型安全和边界检查,确保了数据访问的可靠性和一致性...

    如何存储二进制数据方法

    1. **创建SafeArray**: - 首先定义VARIANT变量和SAFEARRAY结构体。 - 使用`SafeArrayCreate`函数创建SafeArray,指定元素类型(例如`VT_UI1`表示无符号字节)和维数。`SAFEARRAYBOUND`结构体用来设置数组的边界和...

    safearray-1.zip_SafeArray

    SafeArray的使用通常涉及到以下几个关键点: - 创建:使用`SafeArrayCreate`函数创建一个空的SafeArray,指定数组的维度、类型和其他属性。 - 填充:使用`SafeArrayPutElement`函数将数据放入数组的特定位置。 - ...

    学会使用SafeArray 之 Delphi篇--源码

    比如三层架构中通常需要将使用的ClientDataSet数据集传出,那么就可以将DataSet转换为SafeArray,再由其他模块转换接收。 ===============================================================================

    ScriptObject (脚本解析类)

    bool RunProcedure(LPCTSTR szProcName, SAFEARRAY** saParameters, VARIANT* varRet); //protected: void CommonConstruct(); bool GetMethodsName(); LPCTSTR GetScriptFunction(LPCTSTR name);

    COM MFC C++各种字符串,类型之间的转换

    3. **SAFEARRAY**: SAFEARRAY是COM中用于表示数组的数据结构,它可以包含不同类型的元素,包括字符串。SAFEARRAY可以动态调整大小,具有边界检查,并支持多维数组。处理SAFEARRAY时,你需要使用SafeArrayCreate、...

    Java通过Jacob调用ActiveX,进行二进制数据交换

    对于二进制数据的交换必须使用Variant类型,但是在实际使用过程中使用VC2008ActiveX项目向导生成的ocx触发事件中带有Variant类型的参数时,ocx控件在触发事件消息之后就会出现内存异常,导致程序无法正常运行,而...

    SafeArray实现对Excel的导入\导出例子源代码

    使用SafeArray对Excel导入/导出(区域读写数据),比使用单元格循环读写速度快上一百倍以上,经过测试整个工作表65526*10的数据区域,导入时间与导出时间就35秒钟左右,速度上与读写普通的文本文件有得比,基本能让人满意....

    在COM和ATL中使用用户定义的类型

    - **填充和传递SAFEARRAY**: 将UDT对象放入SAFEARRAY,然后在接口方法中将这个数组传递给调用者。 - **接收和解码SAFEARRAY**: 在接收端,需要解析SAFEARRAY,提取其中的UDT对象,并进行适当的处理。 **4. ATL支持*...

    标准MFC WinSock ActiveX控件开发实例(II)高级篇

    SAFEARRAY** SAFEARRAY是一种在COM中表示数组的数据结构,尤其适用于跨进程边界传递数组数据。在MFC WinSock ActiveX控件中,SAFEARRAY可用于封装多维数组或复杂数据类型的集合,如传递字节缓冲区进行网络通信。...

    VB真是想不到系列之四:VB指针葵花宝典之SafeArray.docx

    《VB指针葵花宝典之SafeArray》深入解析 VB中的指针操作一直以来都是一个让人又爱又恨的话题。虽然指针可以显著提升数组操作的效率,但是使用CopyMemory等函数进行字节级操作的繁琐性和潜在的风险,使得VB中的指针...

Global site tag (gtag.js) - Google Analytics