我想在DCOM中对象中使用VARIANT类型,周期性将某二进制数据更新到一个数据缓冲区中,然后DCOM对象调用其他函数再把该数据送到客户端,由客户端处理该数据?

解决方案 »

  1.   

    Safearray是一个数组结构,不能把大量的数据区直接写入数据!
      

  2.   

    为什么不能?VARIANT的SAFEARRAY不就是为什么情况准备的吗?
    你的数据量有多大?
      

  3.   

    几十K到1M吧!对于使用SAFEARRAY传输大数据,我不知道该怎么使用,请指点迷经,谢谢!
      

  4.   

    这是一个创建并向SAFEARRAY写入数据的例子
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = 1000;
    SAFEARRAY* psa = ::SafeArrayCreate(VT_I4, rgsabound); // Create a one-dimension long array of 1000 elements
    long* plDatas;
    ::SafeArrayAccessData(psa, (void**) &plDatas);
    for (int i = 0; i < 1000; i++)
    {
    plDatas[i] = i * i;
    }
    ::SafeArrayUnaccessData(psa);这是如何读取使用上面代码生成的SAFEARRAY中的数据的例子
    VARTYPE vt;
    ::SafeArrayGetVartype(psaDataID, &vt);
    ASSERT(vt == VT_I4);
    UINT nDim = ::SafeArrayGetDim(psa);
    ASSERT(nDim == 1);
    long lLBound, lUBound;
    ::SafeArrayGetLBound(psa, 1, &lLBound); //一维数组下标
    ::SafeArrayGetUBound(psa, 1, &lUBound); //一维数组上标
    long* pDataID;
    ::SafeArrayAccessData(psaDataID, (void**) &pDataID);
    for (int i = 0; i <= lUBound - lLBound; i++)
    {
    //现在你的可以对pDataID中的数据进行访问
    }
    ::SafeArrayUnaccessData(psa);当然你还可以使用
    SafeArrayPutElement(向SAFEARRAY中写入数据)

    SafeArrayGetElement(从SAFEARRAY中读取数据)
    ,只是这两种方式没有上面的快
      

  5.   

    我可不可以这样用:
    for (int i = 0; i < 1000; i++)
    {
    psa[i] = i * i;
    }
      

  6.   

    我用CMemoryState类怎么无法检测使用SafeArrayCreate函数分配的内存的大小!
      

  7.   

    有没有知道用SafeArrayCreate分配的内存怎么才能检测到?
      

  8.   

    如果用safeArray分配的SAFEARRAY的指针不为空,岂不是内存分配成功。我也是用这种方法传递的,没有问题。但问题是如果数据太大,我的有14M左右,写入com中很慢,读很快。我正在尝试着用其它的方法。
      

  9.   

    我说的不是分配是不是成功,我是想检测大分配了多大的空间,以及它在那里分配的,我用检测内存泄漏的类CMemoryState无法检测到内存分配的变化,所以它不是在堆上分配的。所有,我想知道它在那里分配的,分配多大空间等等的方法。
      

  10.   

    内存句柄有个Globalxxxx函数获得大小的……