OCX通过IDispatch传递结构体的4种方法

简介: 1)Pass each structure member as an individual method parameter.2)Serialize the structure to an opaque array of bytes.
1)Pass each structure member as an individual method parameter.
2)Serialize the structure to an opaque array of bytes.
3)Serialize the structure to an array of VARIANTs, one array element per structure member.
4)Implement a dispatch/dual wrapper object that contains the structure and pass an interface to the wrapper object as a parameter.

1 就是依次返回每个结构体成员
2 序列化
3 序列化到VARIANT类型里面
4 多写一个对象,包装这个结构体.


variant与结构体之间的相互转化方式

用SafeArray传。下面是代码:
struct studentsInfo
{
short grade;
CString name;
int type;
};

VARIANT CMyIeDlg::SetStruct()
{
HRESULT hr;
SAFEARRAY* pSa = NULL;
SAFEARRAYBOUND rgbounds;
VARIANT vaResult ;
Variant Init(&vaResult);

rgbounds.1Lbound = 0;//下标从0开始
rgbounds.cElements = 1;//元素个数为1个结构体
studentsInfo StudentStruct;
StudentStruct = stuctInfo;//结构体复制

pSa = SafeArrayCreate(VT_VARIANT, 1, &rgbounds);
pSa->fFeatures = FADF_AUTO | FADF_FIXEDSIZE;//指定在栈上分配数据,大小不可以改变
pSa->cbElements = sizeof( StudentStruct );
pSa->pvData = & StudentStruct;

vaResult.vt = VT_ARRAY | VT_UI1;
vaResult.parray = pSa;


return vaResult;
}




void CMyIeDlg:: GetStruct ()
{
HRESULT hr;
SAFEARRAY* psaStudent = NULL;
studentsInfo *pStudentStruct = NULL;
studentsInfo students;

psaStudent = SetStruct();
hr = SafeArrayAccessData(psaStudent, reinterpret_cast<PVOID*>(&pStudentStruct));

students = * pStudentStruct;

hr = SafeArrayUnaccessData(psaStudent);

SafeArrayDestroy( psaStudent );
}
相关文章
|
6月前
|
JSON 数据格式
调用 sap.ui.base.ManagedObject 的构造函数时,如何传递绑定路径进去
调用 sap.ui.base.ManagedObject 的构造函数时,如何传递绑定路径进去
25 0
|
6月前
|
XML 测试技术 数据格式
SAP UI5 Page 控件的构造函数参数讲解
SAP UI5 Page 控件的构造函数参数讲解
32 0
|
8月前
普通函数中的this指向问题解决方案call
普通函数中的this指向问题解决方案call
33 0
解决办法:对avcodec_parameters_from_context未定义的引用
解决办法:对avcodec_parameters_from_context未定义的引用
43 0
|
存储 C++ 索引
C++中避免返回指向对象内部的句柄(handles)
C++中避免返回指向对象内部的句柄(handles)
139 0
【QT】解决QT两个类之间传递变量失败,或者extern变量引用无效。
【QT】解决QT两个类之间传递变量失败,或者extern变量引用无效。
Qt信号槽使用结构体作为参数:Q_DECLARE_METATYPE和qRegisterMetaType的作用
Qt信号槽使用结构体作为参数:Q_DECLARE_METATYPE和qRegisterMetaType的作用
1350 0
|
C++
浅析C++的引用与const指针与各种传递方式
转自:https://www.jb51.net/article/120561.htm   首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量; 而 int * const p 跟上面是不一样的,即 p 是常量; 我们知道引用只是一个别名,与变量共享存储空间,并且必须在定义的时候初始化,而且不能再成为别的变量的别名,这让我们想到什么呢,貌似跟  int * const p   的性质很像。
1115 0
|
C# C++
C#调用C/C++ DLL 参数传递和回调函数的总结
原文:C#调用C/C++ DLL 参数传递和回调函数的总结 Int型传入: Dll端: extern "C" __declspec(dllexport) int Add(int a, int b) ...
5483 0
|
安全 C# C++
C#调用带结构体指针的C Dll的方法
原文:C#调用带结构体指针的C Dll的方法 在C#中调用C(C++)类的DLL的时候,有时候C的接口函数包含很多参数,而且有的时候这些参数有可能是个结构体,而且有可能是结构体指针,那么在C#到底该如何安全的调用这样的DLL接口函数呢?本文将详细介绍如何调用各种参数的方法。
3421 0