HRESULT ArrayToBinary(_variant_t &InputArray, unsigned char buf[], long len) { ATLASSERT( (VT_VARIANT | VT_ARRAY) == InputArray.vt ); ATLASSERT( 1 == InputArray.parray->cDims ); if ( (VT_VARIANT | VT_ARRAY) != InputArray.vt ) { return E_INVALIDARG; } //ATLASSERT( VT_UI1 == InputArray.parray->) VARIANT *pValue = NULL; SafeArrayAccessData(InputArray.parray,(void**)&pValue); int count = InputArray.parray->rgsabound[0].cElements; for (int i = 0; i < count; ++i) { cout << "array[" << i << "] = " << hex << (long)pValue[i].bVal << endl; } SafeArrayUnaccessData(InputArray.parray); return S_OK; } HRESULT BinaryToArray(BYTE buf[], SAFEARRAY* parray , long /*len*/) { VARIANT *pValue = NULL; SafeArrayAccessData(parray, (LPVOID *)&pValue); int count = parray->rgsabound[0].cElements; for (int i = 0; i < count; ++i) { pValue[i] = _variant_t(buf[i]); } SafeArrayUnaccessData(parray); return S_OK; } HRESULT TestBinaryToArray(IRDOFolder * folder) { CComQIPtr<IRDOFolder> spFolder(folder); SAFEARRAY* pArray=NULL; pArray = SafeArrayCreateVector(VT_VARIANT, 0, 10); pArray->fFeatures = FADF_AUTO|FADF_FIXEDSIZE; BYTE buf[10] = {0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0x90}; buf[0] = rand(); buf[1] = rand(); BinaryToArray(buf, pArray, 0); VARIANT vValue; ::VariantInit(&vValue); vValue.vt = VT_ARRAY|VT_VARIANT; vValue.parray = pArray; spFolder->PutFields(TAG_FOLDER_SHARE_HEADER, vValue); spFolder->Save(); SafeArrayDestroy(pArray); return S_OK; } 一直对安全数组的操作很含糊,项目的用到一个控件的一个方法,获取的属性是一个安全数组,设置属性也是一个安全数组,但我的数据是一个结构体,以二进制的形式保存,所以有这两个函数。