- SAFEARRAY * psa; //定义safearray
- SAFEARRAYBOUND rgsabound[1]; //根据数组的维数来定义几个数组元素,本例是一个一维数组
- rgsabound[0].cElements = postLen; //数组的元素个数
- rgsabound[0].lLbound = 0; //数组起始下标
- psa = SafeArrayCreate(VT_UI1, 1, rgsabound); // 定义一维数组。
- //psa = SafeArrayCreateVector(VT_UI1, 0, postLen); //和上一命令行功能相同。
- if(!psa)
- return E_FAIL;
- BSTR HUGEP * pbstr;
- HRESULT hr = SafeArrayAccessData(psa, (void HUGEP* *)&pbstr); //访问数组内容,获取数组元素的起始地址存入变量pbstr中。//lock
- if (FAILED(hr))
- return E_FAIL;
- memcpy(pbstr, postStr, postLen); //给数组赋值。
- SafeArrayUnaccessData(psa);//unlock
- VARIANT postData;
- postData.vt = VT_ARRAY | VT_UI1;
- postData.parray = psa;
- CComBSTR bstrUrl = "http://cn.yahoo.com";
- VARIANT headers;
- headers.vt = VT_BSTR;
- headers.bstrVal = BSTR(L"Content-Type: application/x-www-form-urlencoded\r\n");
- //定义header信息,必须发送。
- mWebBrowser2->Navigate(bstrUrl, NULL, NULL, &postData, &headers); //发送数据
void CMyIeDlg::putArrays()
{
HRESULT hr;
SAFEARRAY* psaStudent = NULL;
SAFEARRAYBOUND rgbounds = { 4, 0 };
studentsInfo *pStudentStruct = NULL;
psaStudent = SafeArrayCreate(VT_VARIANT, 1, &rgbounds);
hr = SafeArrayAccessData(psaStudent, reinterpret_cast<PVOID*>(&pStudentStruct));
pStudentStruct[0].grade = 3;
pStudentStruct[0].name = SysAllocString(L"Shaun");
pStudentStruct[0].type = class_Clown;
pStudentStruct[1].grade = 8;
pStudentStruct[1].name = SysAllocString(L"Fred");
pStudentStruct[1].type = school_Bully;
pStudentStruct[2].grade = 12;
pStudentStruct[2].name = SysAllocString(L"Steve");
pStudentStruct[2].type = teachers_Favorite;
pStudentStruct[3].grade = 3;
pStudentStruct[3].name = SysAllocString(L"Linda");
pStudentStruct[3].type = teachers_Favorite;
hr = SafeArrayUnaccessData(psaStudent);
m_array.vt = VT_ARRAY;
m_array.parray = psaStudent;
}
void CMyIeDlg::getArrays()
{
HRESULT hr;
SAFEARRAY* psaStudent = NULL;
studentsInfo *pStudentStruct = NULL;
studentsInfo students[4];
psaStudent = m_array.parray;
hr = SafeArrayAccessData(psaStudent, reinterpret_cast<PVOID*>(&pStudentStruct));
for(int i = 0; i<4;i++)
{
students[i].grade = pStudentStruct[i].grade ;
students[i].name = pStudentStruct[i].name ;
students[i].type = pStudentStruct[i].type ;
}
hr = SafeArrayUnaccessData(psaStudent);
}
使用SafeArrayCreateEx创建包含结构的一维数组
使用SAFEARRAY传递UDT(自定义结构)是一项常用的技术,MSDN文档描述得比较齐全,要注意的一点是,自定义结构要求有自己的GUID,这必须在IDL文件中定义。同时还必须要使用IRecordInfo,该接口将和数组一起传递出去,IRecordInfo接口内部记录了UDT的描述信息。
IDL文件中:
[uuid(810930AA-9229-46e7-B20C-41F6218D0B1A)]
struct _BookMarkSchema
{
BSTR Name;
BSTR Context;
BSTR Time;
};
…
interface IShape : IDispatch
{
[id(6), helpstring("获取属于某用户的书签名称列表")] HRESULT GetBookMarkName([in] BSTR UserID,[out] SAFEARRAY(struct _BookMarkSchema)* pBookMarkNames);
}
library SarstShapeLib
{
importlib("stdole2.tlb");
[
uuid(DBDCC0F1-38F3-4EB4-A5BD-79A3707BDE9C),
helpstring("Shape Class")
]
coclass Shape
{
[default] interface IShape;
};
struct _BookMarkSchema;
};
方法的实现为:
STDMETHODIMP CShape::GetBookMarkName(BSTR UserID,SAFEARRAY** pBookMarkNames)
{
//获得GIS库信息
CSarstConfigure Configure;
string Flag("GIS");
string IP,Database,UserName,Key,Context;
Configure.GetDatabaseInfo(Flag,IP,Database,UserName,Key,Context);
//读取图层属性数据
USES_CONVERSION;
string user(CString(UserID).GetBuffer());
string sql("SELECT 书签名,书签描述,时间 FROM 用户书签表 where 用户ID='"+user+"' order by 时间 desc");
FBData data(IP,Database,UserName,Key);
table t=data.GetTable(sql);
if(t.empty())
{
return S_FALSE;
}
//创建SafeArray
IRecordInfo* pRecordInfo=NULL;
HRESULT hr=::GetRecordInfoFromGuids(LIBID_SarstShapeLib,1,0,GetUserDefaultLCID(),IID_STRUCT_BookMarkSchema,&pRecordInfo);
if(FAILED(hr))
return E_FAIL;
*pBookMarkNames=::SafeArrayCreateVectorEx(VT_RECORD,0,long(t.size()-1),(void*)pRecordInfo);
_BookMarkSchema* pData=NULL;
hr=::SafeArrayAccessData(*pBookMarkNames,(void**)&pData);
for(int i=0;i <int(t.size()-1);i++)
{
t[i+1].at(0).CopyTo(&pData[i].Name);
t[i+1].at(1).CopyTo(&pData[i].Context);
t[i+1].at(2).ChangeType(VT_BSTR);
t[i+1].at(2).CopyTo(&pData[i].Time);
}
::SafeArrayUnaccessData(*pBookMarkNames);
pRecordInfo->Release();
return S_OK;
}