天天看點

OCX通過IDispatch傳遞結構體的4種方法variant與結構體之間的互相轉化方式

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;

VariantInit(&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()

SAFEARRAY* psaStudent = NULL;

studentsInfo *pStudentStruct = NULL;

studentsInfo students;

psaStudent =

SetStruct();

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

students = *pStudentStruct;

hr = SafeArrayUnaccessData(psaStudent);

SafeArrayDestroy(psaStudent);

繼續閱讀