Пробую загрузить richedit при помощи SendMessage/EM_STREAMIN с использованием callback. Код (Text): int File_Load(HWND hEdit){ HANDLE hFile; int Read; EDITSTREAM est; if (INVALID_HANDLE_VALUE != (hFile= CreateFile(FileName, GENERIC_READ | GENERIC_WRITE, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL))) { est.dwCookie = (DWORD_PTR)hFile; est.dwError = 0; est.pfnCallback = (EDITSTREAMCALLBACK) & Open_Callback; SendMessage (hEdit, EM_STREAMIN, SF_TEXT, (LPARAM) & est); filesize = GetFileSize(hFile, (LPDWORD) &Read); CloseHandle(hFile); SendMessage(hEdit,EM_SETMODIFY,0,0); } return 0; } // это callback: int Open_Callback(HANDLE dwCookie, LPVOID pbBuff, int cb, LPDWORD pcb){ char buffer[256]; BOOL result; int read; wsprintf(buffer,"dwCookie=%lu, pbBuff=%lu, cb=%lu, pcb=%lu",dwCookie, pbBuff,cb,pcb); MessageBox(hWnd,buffer,NULL,NULL); result = ReadFile(dwCookie,pbBuff,cb,pcb,NULL); read = *((DWORD*)pcb); wsprintf(buffer,"dwCookie=%lu, pbBuff=%lu, cb=%lu, read=%lu",dwCookie, pbBuff,cb,read); MessageBox(hWnd,buffer,NULL,NULL); return 0; } richedit вызывает дважды callback. На первом вызове запрашивается 4094 байта (cb), читается 3508 (*((DWORD*)pcb)) - это размер файла. Затем callback вызывается повторно, с запросом тех же 4094 байт. При этом второй раз ReadFile выдаёт, что считано ноль. Возврат в *((DWORD*)pcb) нуля означает конец загрузки. После второго возвращения из callBack программа падает. Сам richedit нормальный, если грузить вручную через EM_REPLACE, то работает. Хотелось бы сделать с callback'ом.
Open_Callback должна возвращать ненулевое значение, если нужно закончить операцию чтения. Попробуй так: Код (Text): DWORD CALLBACK Open_Callback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb) { return !ReadFile(hFile, pbBuff, cb, (LPDWORD)pcb, NULL); }
SDragon Хм, работает, спасибо. Но непонятно, как это (возврат ненулевого значения) стыкуется с этим: The control calls the callback function repeatedly, transferring a portion of the data with each call. The control continues to call the callback function until one of the following conditions occurs: <ol type=1>The callback function returns a nonzero value. The callback function returns zero in the *pcb parameter. An error occurs that prevents the rich edit control from transferring data into or out of itself. Examples are out-of-memory situations, failure of a system function, or an invalid character in the read buffer. For a stream-in operation, the RTF code contains data specifying the end of an RTF block. For a stream-in operation on a single-line edit control, the callback reads in an end-of-paragraph character (CR, LF, VT, LS, or PS). </ol> Или вот с таким кодом (заведомо рабочим): Код (Text): invoke ReadFile,dwCookie,pbBuff,cb,pcb,NULL mov eax, 0 ret