You can do it in this way:
#include <Richedit.h>
unsigned int GetRichText(HWND hrich,int bRTF,TCHAR* buff,const unsigned int size)
{
struct _
{
static unsigned int copy(char* dst,unsigned int ndst,char* src,unsigned int nsrc)
{ unsigned int i; for(i=0;i<min(ndst,nsrc);i++) dst[i]=src[i]; dst[i<ndst?i:i-1]=0; return i; }
static unsigned int copy(unsigned short* dst,unsigned int ndst,unsigned short* src,unsigned int nsrc)
{ unsigned int i; for(i=0;i<min(ndst,nsrc);i++) dst[i]=src[i]; dst[i<ndst?i:i-1]=0; return i; }
#ifdef _UNICODE
static void rtfW(unsigned long p,unsigned short* pbBuff,long cb,long* pcb)
{ _*me=(_*)p; me->done=copy(me->buff,me->size,pbBuff,cb); *pcb=cb; }
static void txtW(unsigned long p,unsigned short* pbBuff,long cb,long* pcb)
{ _*me=(_*)p; me->done=copy(me->buff,me->size,pbBuff,cb); *pcb=cb; }
#else
static void rtfA(unsigned long p,char* pbBuff,long cb,long* pcb)
{ _*me=(_*)p; me->done=copy(me->buff,me->size,pbBuff,cb); *pcb=cb; }
static void txtA(unsigned long p,char* pbBuff,long cb,long* pcb)
{ _*me=(_*)p; me->done=copy(me->buff,me->size,pbBuff,cb); *pcb=cb; }
#endif
TCHAR* buff;
unsigned int size;
unsigned int done;
} get = { buff,size,0 };
EDITSTREAM eds = { (DWORD_PTR)&get,0, };
if(bRTF)
{
#ifdef _UNICODE
eds.pfnCallback = (EDITSTREAMCALLBACK)get.rtfW;
SendMessage(hrich,EM_STREAMOUT,SF_RTF|SF_UNICODE,(LPARAM)&eds);
#else
eds.pfnCallback = (EDITSTREAMCALLBACK)get.rtfA;
SendMessage(hrich,EM_STREAMOUT,SF_RTF,(LPARAM)&eds);
#endif
}
else
{
#ifdef _UNICODE
eds.pfnCallback = (EDITSTREAMCALLBACK)get.txtW;
SendMessage(hrich,EM_STREAMOUT,SF_TEXT|SF_UNICODE,(LPARAM)&eds);
#else
eds.pfnCallback = (EDITSTREAMCALLBACK)get.txtA;
SendMessage(hrich,EM_STREAMOUT,SF_TEXT,(LPARAM)&eds);
#endif
}
return get.done;
}
Regards.