как достать документ Rtf из Access

  • Автор темы Dope
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

Dope

#1
Доброго времени суток, всем!
Я делая прогу работающую с базой Access. В базе храниться документ rtf в поле объекта OLE.
Мне надо получить информацию из этого файла и скопировать в файл output.rtf.
Я делаю это так:

CDataRowset* pData = new CDataRowset();
pData->Open();

CFile cFile(TEXT("output.rtf"), CFile::modeWrite);
cFile.Write(pData->column2.m_hData, 60);

результат такой: рM Њ ( Њ 0 Њ 8 Њ @ Њ H Њ P Њ

напишите, что я делаю не так и как это исправить.
помогите пожалуйста!
 
A

artiom_kh

#3
Во первых, следую рекомендациям от мелкогмягких - то данные из полей типа "объект OLE" должны читаться/писаться через объект класса CByteArray.
Во вторых, если твой класс CDataRowset наследован от CDaoRecordset, то в CDataRowset::DoFieldExchange проверь, что-бы код DDX-обмена с твоим полем OLE был примерно таким:

DFX_Binary(pFX, _T("[RTF_DATA]"), m_RTF_DATA,AFX_DAO_LONGBINARY_DEFAULT_SIZE,AFX_DAO_ENABLE_FIELD_CACHE);

где m_RTF_DATA объявлен как CByteArray m_RTF_DATA

лично у меня подобный код пашет как часы, правда я читаю/пишу бимтапы в БД и тоже в "поле объекта OLE"...
 
D

Dope

#4
Спасиб
Я уже разобрался
просто мне надо было достаь текст формата rtf, а аксес сохраняет rtf, как doc...
нужно было просто сохранить его как файл с неизвестным расширением и использовать такой код:

CDataRowset* pData = new CDataRowset();
pData->Open();
pData->MoveFirst();
pData->MoveNext();
char *pCharData=(char *)GlobalLock(pData->column2.m_hData);
char *pRtfStart=(char *)memchr(pCharData,'{',pData->column2.m_dwDataLength);
CFile cFile(TEXT("c:\\output.rtf"), CFile::modeWrite|CFile::modeCreate|CFile::shareDenyNone);
cFile.Write(pRtfStart, pData->column2.m_dwDataLength);
cFile.Close();
GlobalUnlock(pData->column2.m_hData);

pData->Close();
delete pData;
 
Статус
Закрыто для дальнейших ответов.