Обмен данными между процессами. Отображение файлов в память

Страницы работы

Содержание работы

Лекция 10

ОБМЕН ДАННЫМИ МЕЖДУ ПРОЦЕССАМИ (продолжение)

Отображение файлов в память

Передача данных через дисковый файл

#include <windows.h>

#define N 80

int main(int argc, char* argv[])

{  

HANDLE hFile;

char buff[N]={'\0'};

DWORD n;

do{

scanf("%s",buff);

hFile = CreateFile("test.txt",          

                GENERIC_WRITE,              

                FILE_SHARE_READ,          

                NULL,                     

                TRUNCATE_EXISTING,            

                FILE_ATTRIBUTE_NORMAL,    

                NULL);                    

if (hFile == INVALID_HANDLE_VALUE)

{

        printf("Could not open file."); 

}

WriteFile(hFile,buff,N,&n,NULL);

CloseHandle(hFile);

}while(getch()!=27);

       return 0;

}

 

#include <windows.h>

#define N 80

int main(int argc, char* argv[])

{  

HANDLE hFile;

char buff[N]={'\0'};

DWORD n;

while(getch()!='q'){

       hFile = CreateFile("test.txt",      

             GENERIC_READ,            

             0,                        

             NULL,                     

             OPEN_EXISTING,                                    

             FILE_ATTRIBUTE_NORMAL,    

             NULL                                 

             );                       

       if (hFile == INVALID_HANDLE_VALUE)

       {

             printf("Could not open file."); 

       }

       ReadFile(hFile,buff,N,&n,NULL);

       buff[n]=0;

       printf("%s\n",buff);

       CloseHandle(hFile);

}

       return 0;

}

 
 


HANDLE CreateFile(
  LPCTSTR lpFileName,                        // имя файла
  DWORD dwDesiredAccess,                 // GENERIC_READ, GENERIC_WRITE
  DWORD dwShareMode,                       // FILE_SHARE_WRITE, FILE_SHARE_READ,
                                                                 // FILE_SHARE_DELETE
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,   // NULL – дескриптор файла не
                                                                                         // наследуется
  DWORD dwCreationDisposition,         //
  DWORD dwFlagsAndAttributes,          // 
  HANDLE hTemplateFile                      // Копирование аттрибутов шаблона

);

dwCreationDisposition:

CREATE_ALWAYS            2     Всегда создает новый файл.

CREATE_NEW                   1     Создает новый файл только, если он не существует.

OPEN_ALWAYS                 4      Всегда открывает новый файл.

OPEN_EXISTING               3      Открывает файл, если он существует.

TRUNCATE_EXISTING   5       Открывает файл и стирает его содержимое только, если файл существует.

DwFlagsAndAttributes:

FILE_ATTRIBUTE_ARCHIVE  32 (0x20)  Архивный файл

FILE_ATTRIBUTE_ENCRYPTED 16384 (0x4000) Шифрованный файл

FILE_ATTRIBUTE_HIDDEN 2 (0x2) Скрытый файл

FILE_ATTRIBUTE_NORMAL  128 (0x80) 

FILE_ATTRIBUTE_READONLY  1 (0x1)  Файл только для чтения

…...........................................................................................................................................................

FILE_FLAG_DELETE_ON_CLOSE   0x04000000 Файл удаляется, когда закрыты все дескрипторы

FILE_FLAG_NO_BUFFERING           0x20000000  Файл открывается без системного кэширования

FILE_FLAG_OVERLAPPED               0x40000000  Файл открывается для асинхронного ввода/вывода

…...................................................................................................................................................

BOOL WINAPI WriteFile(

  HANDLE hFile,

  LPCVOID lpBuffer,

  DWORD nNumberOfBytesToWrite,

  LPDWORD lpNumberOfBytesWritten,

  LPOVERLAPPED lpOverlapped //Асинхронный вывод и

                                                         //установка начальной позиции

);

BOOL WINAPI ReadFile(

  HANDLE hFile,

  LPVOID lpBuffer,

  DWORD nNumberOfBytesToRead,

  LPDWORD lpNumberOfBytesRead,

  LPOVERLAPPED lpOverlapped

);

Отображение файла в память (проецирование файла на память)

T

h

i

s

i

s

a

t

e

s

t

/

/

/

/

20000   I

20001   s

20002

20003

20004   t

20005   h

20006   i

20007   s

20008

20009

2000a   a

2000b

2000c   t

2000d   e

2000e   s

2000f   t

20010   /

20011   /

20012   /

20013   /

 

#define N 20

int main(int argc, char* argv[])

{  

HANDLE hFile,hFileMap;

PBYTE pByte;

int i;

char dummy[2];

char* buff;

buff=(char*)malloc(N);

hFile = CreateFile("test.txt",          

                     GENERIC_READ | GENERIC_WRITE,      

                     0,    

                                     NULL,              

                                     OPEN_ALWAYS,     

                                     FILE_ATTRIBUTE_NORMAL,

                                     NULL);               

if (hFile == INVALID_HANDLE_VALUE)

{

        printf("Could not open file.");   

}

hFileMap=CreateFileMapping(hFile, NULL, PAGE_READWRITE,0,N,NULL);

if(hFileMap==NULL)

{

        printf("Could not create mapping file.");   

}

pByte=(PBYTE)MapViewOfFile(hFileMap,FILE_MAP_WRITE ,0,0,0);

if(pByte==NULL)

{

        printf("Could not map file.");   

}

 CopyMemory(buff,pByte, N);

for(i=0;i<N;i++)

       printf("%c\n",buff[i]);

dummy[0]=pByte[5]-0x20;

dummy[1]=pByte[6];

pByte[0]+=0x20;

for(i=0;i<4;i++)

       pByte[i+4]=pByte[i];

pByte[0]=dummy[0];

pByte[1]=dummy[1];

pByte[2]=' ';

pByte[3]=' ';

for(i=0;i<N;i++)

       printf("%lx\t%c\n",pByte+i,*(pByte+i));

UnmapViewOfFile(pByte);

CloseHandle(hFile);

free(buff);

return 0;

}

 
 


HANDLE CreateFileMapping(
  HANDLE hFile,                       // дескриптор файла
  LPSECURITY_ATTRIBUTES lpAttributes, // 
  DWORD flProtect,                                    // 
  DWORD dwMaximumSizeHigh,          // high-order DWORD объекта отображения
  DWORD dwMaximumSizeLow,             // low-order DWORD объекта отображения
  LPCTSTR lpName                      // имя объекта отображения

);

LPVOID MapViewOfFile(
  HANDLE hFileMappingObject,   // дескриптор объекта отображения
  DWORD dwDesiredAccess,       // моды доступа
  DWORD dwFileOffsetHigh,      // high-order DWORD смещения
  DWORD dwFileOffsetLow,       // low-order DWORD смещения
  SIZE_T dwNumberOfBytesToMap  // количество байт отображения

);

Передача данных через swap-файл

#include <windows.h>

int main(){

 HANDLE hFileMap;

 LPVOID lpMapView;

 char* buff="Hello,students!";

 hFileMap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,256,"MyCommonRegion");

 lpMapView=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,256);

 CopyMemory(lpMapView,buff, sizeof("Hello,students!"));

 getch();

 UnmapViewOfFile(lpMapView);

 CloseHandle(hFileMap);

 return 0;

}

 

#include <windows.h>

int main(){

 HANDLE hFileMap;

 LPVOID lpMapView;

 char buff[80];

 hFileMap=OpenFileMapping(FILE_MAP_READ,TRUE,"MyCommonRegion");

 lpMapView=MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,256);

 CopyMemory(buff,lpMapView, 80);

 printf("%s\n",buff);

 UnmapViewOfFile(lpMapView);

  CloseHandle(hFileMap);

 return 0;

}

 
 


Упражнение: на основе технологии отображения файла в память создайте приложение, эмулирующее чат.

Похожие материалы

Информация о работе