Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с RichEdit'om

7.5K
27 августа 2006 года
Ivan_Cheremisov
23 / / 11.05.2005
Люди подскажите как на чистом API получить текст из RichEdit'а в формате RTF.
Я в MSDN находил что надо использовать сообщение EM_STREAMOUT но при этом вылезает ошибка:
Unhandled exception at 0x74e72bc2 in Project.exe: 0xC0000005: Access violation reading location 0x0000046a.

Текст программы:
///////////////////////////////////////
...

EDITSTREAM es;
es.dwCookie = EM_STREAMOUT;
es.dwError = NULL;
es.pfnCallback = (EDITSTREAMCALLBACK)EditStream;
SendMessage(hREdit, EM_STREAMOUT, SF_RTF, (LPARAM)&es);

//Тут что-то дальше
...
////////////////////////////////////////

DWORD EditStream(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
if(dwCookie==EM_STREAMOUT)
{
HANDLE hFile = CreateFile("my.rtf", GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, pbBuff, cb, (LPDWORD)pcb, NULL);
CloseHandle(hFile);
return TRUE;
}
return FALSE;
}

При этом ошибка возникает после выплнения EditStream, т.е. после записи в файл и перед //Тут что-то дальше.
Как я понимаю если размер конечного файла более 4096 байт то EditStream должна вызываться несколько раз чтобы каждый раз записать по 4096 байт.
Если текст который у меня в RichEdit более 4096 байт то EditStream вызывается несколько раз но с одним и тем же буфером pbBuff т.е. указывает на один и тот же кусок файла. И даже если я добавляю что-то типа
DWORD nbuf;
int len = GetFileSize(hFile, &nbuf);
SetFilePointer(hFile, len, (PLONG)&nbuf, FILE_BEGIN); // а CREATE_ALWAYS заменяю на OPEN_ALWAYS
то всё равно файл не открывается Word'ом
Если у меня в RichEdit'e текста мало конечный файл менее 4096 то тогда сохранённый файл открывается Word'ом но ошибка всёравно вылетает.
Мож кто сталкивался с такой проблемой или знает как получить текст в формате RTF и соответственно обратную процедуру, как прочитать его в RichEdit.
7.8K
28 августа 2006 года
littlefrankie
57 / / 23.08.2006
Я чес говоря с RichEditом дела не имел, но по сообщению об ошибке могу предположить, что ты передаешь неверные параметры SendMessage(). Cкорее всего неверный адрес буфера, так как ошибка происходит при попытке чтения из 0x0000046a. (Вообще любой указатель меньше 0x00001000 является неверным)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог