| хотел как-то для красоты использовать GetLastError() с блоками __try{}, но не получилось сообщения "Операция успешно завершена", если перезаписівается существующий файл
#include "windows.h"
int ShowErrorMessage( char*);
int main(void)
{
UINT flag, nBytesRead, nBytesWritten; //
HANDLE* hinfile, houtfile; //(HANDLE)-1
char* buff; // буфер
START_PROGRAM:
__try{
flag = 0;
hinfile = CreateFile(
"D:\\Bootfont.bin"
, GENERIC_READ // open for reading
, FILE_SHARE_READ // share for reading
, NULL // default security
, OPEN_EXISTING // existing file only
, FILE_ATTRIBUTE_NORMAL // normal file
, NULL);
if (hinfile == INVALID_HANDLE_VALUE) __leave;
flag++;
houtfile = CreateFile("d:_zzz.txt"
, GENERIC_READ |GENERIC_WRITE
, 0 // do not share
// , FILE_SHARE_READ |FILE_SHARE_WRITE
, NULL
, CREATE_ALWAYS // перезапишет существующий тоже
, FILE_ATTRIBUTE_NORMAL
, NULL);
if (houtfile == INVALID_HANDLE_VALUE) __leave;
flag |= 2;
buff = VirtualAlloc( 0, 1024, MEM_COMMIT, PAGE_READWRITE); //выделение памяти
if (buff == NULL) __leave;
flag |= 4;
do {
if( ReadFile(hinfile, buff
, 1023, &nBytesRead, 0) == 0) __leave;
if( WriteFile(houtfile, buff, nBytesRead,
&nBytesWritten, 0) == 0) __leave;
} while (nBytesRead == 1023);
//
}
__finally {
if (flag & 1) CloseHandle(hinfile);
if (flag & 2) CloseHandle(houtfile);
if (flag & 4) VirtualFree(buff, 1024, MEM_DECOMMIT);
if ( ShowErrorMessage("можно повторить") == IDRETRY) goto START_PROGRAM;
}
return 0;
}
int ShowErrorMessage( char* txt ) { // GetLastError()
char* lpBuffer;
int err = GetLastError();
char* szBuf = (char*) LocalAlloc(LPTR, 100); //выделение памяти
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM
,0, err, LANG_NEUTRAL, (LPTSTR)&lpBuffer,1024,0);
wsprintf(szBuf,
"код:%#08lx %s", err, txt);
err = MessageBox(0, lpBuffer, szBuf
, MB_ICONERROR |MB_RETRYCANCEL |MB_DEFBUTTON2);
LocalFree(lpBuffer); //освобождение памяти
LocalFree(szBuf); //освобождение памяти
return err;
} |
| |