Надо продемонстрировать асинхронный доступ к файлу. Программа не совсем корректная в этом плане. но.
Вопрос вот в чем: при чтении файла и отображении его в edit получается абракодабра. Я так понимаю проблема в типе буфера и что-то с Ascii и Unicode кодировке. Наверное. Посмотрите, пожалуйста, в чем ошибка.
Еще проблема при очистке буфера. Выдает ошибку. Не понимаю почему.
#include "windows.h"
#include "stdafx.h"
#include "resource.h"
HINSTANCE hThisInstance;
TCHAR filename[MAX_PATH]; /*буфер имени файла*/
LRESULT CALLBACK MainProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int) {
hThisInstance=hInst;
DialogBox(hInst, MAKEINTRESOURCE(MnWnd),NULL,(DLGPROC)MainProc);
}
/* диалоговая процедура */
LRESULT CALLBACK MainProc(HWND hw,UINT msg,WPARAM wp,LPARAM lp)
{
static DWORD OldIcon=0; /* id старой иконки диалога */
static OPENFILENAME of;
OVERLAPPED olr;
OVERLAPPED olw;
PCTSTR* bufr;
PCTSTR* bufw;
HANDLE hf;
DWORD len,len1;
switch (msg) {
case WM_INITDIALOG: /* меняем иконку диалога */
OldIcon=SetClassLong(hw,GCL_HICON,(long)LoadIcon(hThisInstance,MAKEINTRESOURCE(MyIcon)));
return TRUE;
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDCANCEL: /* посылается при закрытии диалога по [Esc]*/
case ID_EXIT: /* команда меню "ВЫход" */
DestroyWindow(hw);
break;
case ID_OPEN: /* команда меню "Открыть" */
of.lStructSize=OPENFILENAME_SIZE_VERSION_400A;
of.hwndOwner=hw;
of.lpstrFilter=_T("Text Files (*.TXT)\0*.txt\0");
of.lpstrCustomFilter=NULL;
of.nMaxCustFilter=0;
of.nFilterIndex=1;
of.lpstrFile=filename;
of.nMaxFile=MAX_PATH;
of.lpstrFileTitle=NULL;
of.nMaxFileTitle=0;
of.lpstrInitialDir=NULL;
of.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
if (!GetOpenFileName(&of)) break;
SetDlgItemText(hw,ID_STATUS,filename);
/* открываем файл */
hf=CreateFile(filename,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if (hf==INVALID_HANDLE_VALUE) {
MessageBox(hw,_T("Ошибка открытия"),_T("Error"),MB_ICONHAND|MB_OK);
break;
}
len=GetFileSize(hf,NULL);
bufr=(PCTSTR*)malloc(len+1); /* доп. байт под символ-терминатор (0) */
if (!bufr) {
MessageBox(hw,_T("Ошибка выделения памяти"),_T("Error"),MB_ICONHAND|MB_OK);
break;
}
olr.Offset=0;
olr.OffsetHigh=0;
olr.hEvent=0;
ReadFile(hf,LPWSTR(bufr),len,NULL,&olr);
//bufr[len+1]='\0';
CloseHandle(hf);
SetDlgItemText(hw,ID_EDIT,LPWSTR(bufr));
free(bufr);
break;
case ID_SAVEAS: /* команда меню "Сохранить как" */
of.lStructSize=OPENFILENAME_SIZE_VERSION_400A;
of.hwndOwner=hw;
of.lpstrFilter=_T("Text Files (*.TXT)\0*.txt\0");
of.lpstrCustomFilter=NULL;
of.nMaxCustFilter=0;
of.nFilterIndex=1;
of.lpstrFile=filename;
of.nMaxFile=MAX_PATH;
of.lpstrFileTitle=NULL;
of.nMaxFileTitle=0;
of.lpstrDefExt = _T("txt") ;
of.lpstrInitialDir=NULL;
of.Flags=OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY;
if (!GetSaveFileName(&of)) break;
case ID_SAVE: /* команда меню "Сохранить" */
if (lstrlen(filename)==0) {
/* для нового файла - вызываем диалог "Сохранить как" */
PostMessage(hw,WM_COMMAND,ID_SAVEAS,lp);
break;
}
SetDlgItemText(hw,ID_STATUS,filename);
/* сохраняем файл */
hf=CreateFile(filename,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if (hf==INVALID_HANDLE_VALUE) {
MessageBox(hw,_T("Ошибка сохранения"),_T("Error"),MB_ICONHAND|MB_OK);
break;
}
len=SendDlgItemMessage(hw,ID_EDIT,WM_GETTEXTLENGTH,0,0);
bufw=(PCTSTR*)malloc(len+1); /* доп. байт под символ-терминатор (0) */
GetDlgItemText(hw,ID_EDIT,LPWSTR(bufw),len+1);
if (!bufw) {
MessageBox(hw,_T("Ошибка выделения памяти"),_T("Error"),MB_ICONHAND|MB_OK);
break;
}
bufw[len+1]='\0';
olw.Offset=0;
olw.OffsetHigh=0;
olw.hEvent=0;
WriteFile(hf,bufw,sizeof(bufw)+1,NULL,&olw);
CloseHandle(hf);
//free(bufw);
break;
case ID_ABOUT: /* команда меню "About" */
MessageBox(hw,_T("Асинхронный доступ к файлам"),_T("О программе..."),MB_OK|MB_ICONINFORMATION);
break;
}
return TRUE;
case WM_DESTROY: /* при закрытии окна восстанавливаем старую иконку */
SetClassLong(hw,GCL_HICON,(long)OldIcon);
PostQuitMessage(0);
return TRUE;
}
return FALSE;
}