怎么用(VARIANT*)把自定义的对象或者结构传给客户程序,希望能给个小的事例代码以事件或者方法的形式!谢谢!

解决方案 »

  1.   

    传对象可以,传结构是不行的,用_variant_t包装类来做比较方便,直接赋值就可以了。
    IDocument* pDoc;
    _variant_t vt = pDoc;
      

  2.   

    为什么传不成结构呢?上面这位大哥,如果可以传对象在vb下就没法用了,vb里没有对象那一说,有什么办法把传结构?我用下面的办法测试了一下不行,不知道有什么问题?帮我看看!数据没传出去。
    struct Mystuct
    {
    float x;
    float y;
    float z;
    };
    Mystuct m_struct[10];
    for(int i=0;i<10;i++)
    {
    m_struct[i].x=i;
    m_struct[i].y=i;
    m_struct[i].z=i;
    }
    HRESULT hr;
    //create an array bound
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0; //The first (and only) collumn of our array starts at 0.
    rgsabound[0].cElements = 10; //and has 100 elements.

    //create the array
    SAFEARRAY FAR* pMySafeArray;
    pMySafeArray = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
    Mystuct *pData;
    hr = SafeArrayAccessData(  pMySafeArray, reinterpret_cast<PVOID*>(&pData)); //Get a pointer to the data.


    //copy the  bytes of data from our old array to the new one.
    memcpy(pData, m_struct, 120);
    for(int i = 0; i < 10; i++) ASSERT(pData[i].x == m_struct[i].x);
    SafeArrayUnaccessData(pMySafeArray);


    //To put the SafeArray in a Variant
    VARIANT myVariant; 
    myVariant.parray = pMySafeArray;
    myVariant.vt = VT_ARRAY; VARIANT NewVariant;
    NewVariant.vt = VT_EMPTY; // must set variant type for copy to work.
    hr = VariantCopy(&NewVariant, &myVariant); //check array in copy of variant
    Mystuct* pNewData;
    hr = SafeArrayAccessData(NewVariant.parray, reinterpret_cast<PVOID*>(&pNewData));
    for(int i = 0; i < 10; i++) ASSERT(pData[i].x == pNewData[i].x);
    //ASSERT(pData != pNewData); //copying the varriant created a new copy of the 
       //array it contained too.  There is now 2 copies of the data.
    SafeArrayUnaccessData(NewVariant.parray);
      

  3.   

    谁跟你说VB里没对象的?VB要没有对象怎么支持COM?
    你这么传到VB里肯定是没法用的,标准的解决方案是做一个枚举器对象,通过枚举对象返回数据,类似ADO里的Recoderset
      

  4.   

    typedef struct
    {
    int InCount;
    int OutCount;
    char *Name;
    }MyData;//结构体包成variant
    PutData(VARIANT *val)
    {
    HRESULT hr;
    SAFEARRAY *psaData = NULL;
    SAFEARRAYBOUND saBound = {4,0};
    MyData *pMyData = NULL;psaData = SafeArrayCreate(VT_VARIANT,1,&saBound);hr = SafeArrayAccessData(psaData,reinterpret_cast<void **>(&pMyData));pMyData[0].InCount = 8;
    pMyData[0].OutCount = 2;
    pMyData[0].Name = "LZY1";
    pMyData[1].InCount = 11;
    pMyData[1].OutCount = 5;
    pMyData[1].Name = "LZY2";
    pMyData[2].InCount = 13;
    pMyData[2].OutCount = 4;
    pMyData[2].Name = "LZY3";
    pMyData[3].InCount = 15;
    pMyData[3].OutCount = 1;
    pMyData[3].Name = "LZY4";hr = SafeArrayUnaccessData(psaData);(*val).vt = VT_ARRAY;
    (*val).parray = psaData;
    }
      

  5.   

    Analyst这位大哥,能给个小例子吗?我对vb不太懂,但是想做个ActiveX在vb下也能进行数据传递的东东!帮帮忙!
      

  6.   

    参考这篇文章
    http://www.csdn.net/Develop/Read_Article.asp?Id=19697
      

  7.   

    回楼主短消息:在idl/odl文件中,定义结构和枚举的示例
    library XXXXXXXXLib
    {
    importlib(STDOLE_TLB);
    importlib(STDTYPE_TLB); typedef 
    [
    helpstring("control item data"),
    version(1.0)
    ]
    struct CtrlItem
    {
    [helpstring("Item text")]
    BSTR Text;
    [helpstring("Item value( type integer )")]
    LONG Value;
    [helpstring("Item is selected")]
    VARIANT_BOOL Selected;
    }CtrlItem; typedef
    [
    helpstring("Alignment Enumeration"),
    v1_enum,
    version(1.0)
    ]
    enum EAlignment
    {
    eaLeft = 0,
    eaCenter = 1,
    eaRight = 2
    }EAlignment;
    ......
    }
      

  8.   

    up,你定义结构的时候是:
    typedef 
    [
    helpstring("control item data"),
    version(1.0)
    ]
    但是定义枚举是
    typedef
    [
    helpstring("Alignment Enumeration"),
    v1_enum,
    version(1.0)
    ]
    是不是定义结构的时候[]里面还得写个v1_..的,希望给于指点,谢谢!
      

  9.   


    用SafeArray传。下面是代码:
    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);
    }