Асинхронный доступ к файлам winAPI

 

Доброе время суток!

Прошу помощи. Надо было написать прогу для демонстрации асинхронного доступа к файлам. Я в winAPI чайник. Прога конечно не совсем в тему, но не знаю что надо.

В общем вопрос вот в чем: при чтении файла и отображении его в 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;
}

 Помогите, пожалуйста.

 

Вам на www.rsdn.ru с таким вопросом надо.

(кстати, а что такое "асинхронный доступ к файлам"?)

 
stringo:

Вам на www.rsdn.ru с таким вопросом надо.

(кстати, а что такое "асинхронный доступ к файлам"?)

ну, при синхронном доступе, например при чтении, программа ждет пока выполнится операция чтения и только потом передает управление назад в программу. а при асинхронном пока система считывает данные программа выполняется далее. Знаю что моя программа этого не демонстрирует. но я не могу придумать, как это сделать.

использованы только атрибуты файла для асинх.четния (FILE_FLAG_OVERLAPPED). И функции  ReadFile и WriteFile использованы по варианту с переменной типа OVERLAPPED.

 
Ещё вопрос. При чём тут MQL5?
 

А кто ждать будет завершения операции? А вообще гугль по запросу FILE_FLAG_OVERLAPPED рулит.

И да, форум немножко не тот.