com中例子

来源:互联网 发布:c语言转变大小写字母 编辑:程序博客网 时间:2024/05/06 02:30
 
  1. SAFEARRAY * psa; //定义safearray   
  2.   SAFEARRAYBOUND rgsabound[1]; //根据数组的维数来定义几个数组元素,本例是一个一维数组   
  3.   rgsabound[0].cElements = postLen; //数组的元素个数   
  4.   rgsabound[0].lLbound = 0; //数组起始下标   
  5.   psa = SafeArrayCreate(VT_UI1, 1, rgsabound); // 定义一维数组。   
  6.   //psa = SafeArrayCreateVector(VT_UI1, 0, postLen); //和上一命令行功能相同。   
  7.   if(!psa)   
  8.   return E_FAIL;   
  9.   BSTR HUGEP * pbstr;   
  10.   HRESULT hr = SafeArrayAccessData(psa, (void HUGEP* *)&pbstr); //访问数组内容,获取数组元素的起始地址存入变量pbstr中。//lock   
  11.   if (FAILED(hr))   
  12.   return E_FAIL;   
  13.   memcpy(pbstr, postStr, postLen); //给数组赋值。   
  14.   SafeArrayUnaccessData(psa);//unlock   
  15.   VARIANT postData;   
  16.   postData.vt = VT_ARRAY | VT_UI1;   
  17.   postData.parray = psa;   
  18.   CComBSTR bstrUrl = "http://cn.yahoo.com";   
  19.   VARIANT headers;   
  20.   headers.vt = VT_BSTR;   
  21.   headers.bstrVal = BSTR(L"Content-Type: application/x-www-form-urlencoded\r\n");   
  22.   //定义header信息,必须发送。   
  23.   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;
}