none
如何在 ole 字段中保存 字符串? RRS feed

  • 问题

  • 一个unicode工程,通过ado操作,往access的一个表中的ole字段填充字符串,为何取出来的时候总是被截断的呢?
    我该怎么保存一个字符串到ole中呢?

    下面是我的代码,请指教:
            //开始把文字内存区域的数据写入数据库
            char                  *pBuf = (char *)pText; //内存区域
            VARIANT               varBLOB;
            SAFEARRAY             *psa;  //流描述符
            SAFEARRAYBOUND        rgsabound[1];
    
            if(pBuf) //如果内存区域不为空
            {    
                    rgsabound[0].lLbound = 0;
                    rgsabound[0].cElements = nLenthText; //长度
                    psa = SafeArrayCreate(VT_UI1, 1, rgsabound); //类型是unsigned char/流维数/
                    for (long i = 0; i < (long)nLenthText; i++)
                            SafeArrayPutElement (psa, &i, pBuf++);  //分配单独的元素到流
                    varBLOB.vt = VT_ARRAY | VT_UI1; //类型是safe array|unsigned char
                    varBLOB.parray = psa;
                    m_pRecordset->GetFields()->GetItem(_T("文字"))->AppendChunk(varBLOB); //写入ole字段
                    
            }
    
            //把ole中的文字读出来
            char * pTextBuffer = NULL;
            DWORD lDataSize = m_pRecordset->GetFields()->GetItem("文字")->ActualSize;
            if(lDataSize > 0)  //如果有数据
            {
                    _variant_t        varBLOB;
                    varBLOB = m_pRecordset->GetFields()->GetItem("文字")->GetChunk(lDataSize);
                    if(varBLOB.vt == (VT_ARRAY | VT_UI1)) //类型是safe array|unsigned char
                    {
                            if(pTextBuffer = new char[lDataSize+1])         //分配存储空间
                            {        
                                    char *pBuf = NULL;
                                    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); //锁住缓冲区数据
                                    memcpy(pTextBuffer,pBuf,lDataSize);         //复制数据到缓冲区
                                    SafeArrayUnaccessData (varBLOB.parray);  //解锁缓冲区数据
                                    CString a;
                                    a.Format(_T("%s"), pBuf);
                                    AfxMessageBox(a);  //这里得到的文字总是缺少后面一截,why?
                            }
                    }
             }
    
    
    
    2009年9月14日 9:07

答案

全部回复

  • pText是unicode字符串还是ANSI字符串?nLenthText是字符个数还是字节数?

    你也可以参考
    http://support.microsoft.com/kb/189415/EN-US/


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 happyhhb 2009年9月17日 7:14
    2009年9月15日 3:03
    版主
  • sorry,没有写清楚,呵呵

           CString strText = _T("123456789");
           DWORD nLenthText = strText.GetLength() + 1;
           TCHAR * pText = new TCHAR[nLenthText];
           lstrcpy(pText, strText);
           //AfxMessageBox(pText);  //这里看到的还是"123456789"

           //开始把文字内存区域的数据写入数据库
            char                  *pBuf = (char *)pText; //内存区域
            VARIANT               varBLOB;
            SAFEARRAY             *psa;  //流描述符
            SAFEARRAYBOUND        rgsabound[1];
            CString a;
             a.Format(_T("%s"), pBuf);
             AfxMessageBox(a);  //这里看到的还是"123456789"

            if(pBuf) //如果内存区域不为空
            {   
                    rgsabound[0].lLbound = 0;
                    rgsabound[0].cElements = nLenthText; //长度
                    psa = SafeArrayCreate(VT_UI1, 1, rgsabound); //类型是unsigned char/流维数/
                    for (long i = 0; i < (long)nLenthText; i++)
                            SafeArrayPutElement (psa, &i, pBuf++);  //分配单独的元素到流
                    varBLOB.vt = VT_ARRAY | VT_UI1; //类型是safe array|unsigned char
                    varBLOB.parray = psa;
                    m_pRecordset->GetFields()->GetItem(_T("文字"))->AppendChunk(varBLOB); //写入ole字段

                    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); //锁住缓冲区数据
                    SafeArrayUnaccessData (varBLOB.parray);  //解锁缓冲区数据
                    a.Format(_T("%s"), pBuf);
                    AfxMessageBox(a);  //即使立即查看pBuf,得到的文字也会是缺少后面一截,why?
                    
            }


    问题似乎比较明显,一个字串经过SafeArrayPutElement()等处理后,被截断了(但字串长度是正确的),是不是字符串处理要使用别的函数呢?
    正在看你给我参考的文档
    谢谢指教 ^_^
    2009年9月15日 3:37
  • 谢谢 Sheng Jiang 蒋晟 ,问题解决了

    2009年9月17日 7:14