static HGLOBAL get_unicode_text(ME_TextEditor *editor, const CHARRANGE *lpchrg) { int pars, len; WCHAR *data; HANDLE ret; pars = ME_CountParagraphsBetween(editor, lpchrg->cpMin, lpchrg->cpMax); len = lpchrg->cpMax-lpchrg->cpMin; ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR)*(len+pars+1)); data = GlobalLock(ret); len = ME_GetTextW(editor, data, lpchrg->cpMin, len, TRUE); data[len] = 0; GlobalUnlock(ret); return ret; }
static HGLOBAL get_unicode_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars) { int pars = 0; WCHAR *data; HANDLE ret; ME_DisplayItem *para; int nEnd = ME_GetCursorOfs(start) + nChars; /* count paragraphs in range */ para = start->pPara; while((para = para->member.para.next_para) && para->member.para.nCharOfs <= nEnd) pars++; ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * (nChars + pars + 1)); data = GlobalLock(ret); ME_GetTextW(editor, data, nChars + pars, start, nChars, TRUE, FALSE); GlobalUnlock(ret); return ret; }
DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface, BSTR *pbstrText) { ITextServicesImpl *This = impl_from_ITextServices(iface); int length; length = ME_GetTextLength(This->editor); if (length) { ME_Cursor start; BSTR bstr; bstr = SysAllocStringByteLen(NULL, length * sizeof(WCHAR)); if (bstr == NULL) return E_OUTOFMEMORY; ME_CursorFromCharOfs(This->editor, 0, &start); ME_GetTextW(This->editor, bstr, length, &start, INT_MAX, FALSE, FALSE); *pbstrText = bstr; } else { *pbstrText = NULL; } return S_OK; }