想在COM中输出一个BSTR数组,该怎么分配这个数组的内存?
IDL中语法如下:
[id(5), helpstring("method GetDataAddress")] HRESULT GetDataAddress([out] long *pRow,[out] long* pCol,[out,size_is(,(*pRow)*(*pCol))] BSTR **ppData);//输出一个BSTR类型的数组在函数中是如下做的:
m_pbstrData=(BSTR*)CoTaskMemAlloc(m_nColCount*m_nRowCount*sizeof(BSTR));奇怪的是这个DLL用REFSVR32注册时客户端调用是正常的但如果用COM+注册,就出错
错误如下:
Unhandled exception in testado.exe(Kernel32.dll):0xe06d7363:Microsoft C++ Exception我想问题出在内存分配上,请问各位高手该如何解决?分不够还可以再加!!

解决方案 »

  1.   

    SysAllocString
    Allocates a new string and copies the passed string into it.BSTR SysAllocString( 
      const OLECHAR *  sz  
    );inline void CStatBar::SetText(OLECHAR * sz)
    {
       SysFreeString(m_bstrMsg);   // Free previous string, if any.
       m_bstrMsg = SysAllocString(sz);
       // Caller should check to see if m_bstrMsg is null after calling this method.
    }
      

  2.   

    COM中BSTR应该用SysAllocString或者SysAllocStringLen分配内存
      

  3.   

    在COM中的标准数组应该是安全数组(SafeArrary)吧。如果你采用安全数组的话就不会出现这个问题了
      

  4.   

    你的代码太复杂了你的意思是一个二维数组吧。首先,ppData是一个三级指针,关于三级指针的列集,不是很清楚,很多书都没有讲到三级指针列集问题,是否能够被正确列集我不大清楚你直接使用dll作为进程内组件时,如果你的公寓模型匹配的话,客户和组建之间直接共享内存,所以代码可以正常工作。但在com+当中,参数会被列集以跨越进程,错误可能是列集时产生你的代码有几处我不是很明白,(希望大家多多指教):size_is((*pRow)*(*pCol))怎么描述 ppData所指对象的大小?你必须说明你所传递的所有字符串的长度之和,是不是否还要包括每个bstr字符串额外的存储其长度的4字节的空间?你提供的描述很明显不行.m_pbstrData=(BSTR*)CoTaskMemAlloc(m_nColCount*m_nRowCount*sizeof(BSTR))分配的是存放所有字符串的指针的空间吧?每个字符串的空间是在其他代码中分配的吧 ?所以分配 m_pstrdata不需要 sysallocstring 函数首先,你可能需要引入一个结构,最好用safearray,转换为一维会更简单一些
    用简单的而且在很多地方能被证明是可行的方法最可靠
      

  5.   

    jiangsheng(蒋晟.Net)和bluebohe(薄荷)两位大虾说得对!我同意!
      

  6.   

    COM+中必须使用标准的变量类型,否则无法运行
      

  7.   

    CoTaskMemAlloc分配的空间不符合BSTR标准
    没有长度信息,对于套间传送必有问题,列集无法
    得到内存长度
      

  8.   

    我原来理解错了BSTR在此时是不是被作为内部类型(idl中),而非一个typedef(请教)照你上面的代码,理论上讲可以被正确列集m_pbstrData=(BSTR*)CoTaskMemAlloc(m_nColCount*m_nRowCount*sizeof(BSTR));
    分配的是一bstr数组,与bstr没关系,不能用SysAllocString数组中的每个才bstr需要那样分配,wait
      

  9.   

    BSTR是一个指针,是不是sizeof(BSTR)=4?
      

  10.   

    我想在这用BSTR数组好象分配内存确实比较困难,我用SAFEARRAY试试了,先大家散点分吧