F
Firefox
Здравствуйте. помогите пожалуйста решить такую проблему. делаю обмен между программа через файлы проецируемые на память. В программе где файл создается чтение и запись делается. а вот во второй программе, где файл открывается при попытке чтения программа сразу вылетает в break из-за ошибки по памяти. но файл находит и дисриптор возвращает не нулевой.
C++:
// программа где файл создается
#include "Mapping_File.h"
#include "stdio.h"
LPCWSTR lpFileName_in;
LPCWSTR lpFileName_out;
// Идентификатор отображения файла на память
HANDLE hFileMapping_in;
HANDLE hFileMapping_out;
// Указатель на отображенную область памяти
LPVOID lpFileMap_in,lpFileMap_out;
Mapping_File::Mapping_File()
{
// Имя отображния файла на память
lpFileName_in = L"InFileName";
lpFileName_out = L"OutFileName";
}
Mapping_File::~Mapping_File()
{
;
}
int Mapping_File::CreateMappingFiles()
{
// Создаем объект-отображение
hFileMapping_in = CreateFileMapping(INVALID_HANDLE_VALUE ,
NULL, PAGE_READWRITE, 0, 100, (LPCWSTR)lpFileName_in);
// Если создать не удалось, выводим код ошибки
if(hFileMapping_in == NULL)
{
QMessageBox::warning(0,"Error", "Can't create in mapping file");
return 1;
}
// Создаем объект-отображение
hFileMapping_in = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL, PAGE_READWRITE, 0, 100, (LPCWSTR)lpFileName_out);
// Если создать не удалось, выводим код ошибки
if(hFileMapping_out == NULL)
{
QMessageBox::warning(0,"Error", "Can't create out mapping file");
return 2;
}
// Выполняем отображение файла на память.
// В переменную lpFileMap будет записан указатель на
// отображаемую область памяти
lpFileMap_in = MapViewOfFile(hFileMapping_in,
FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
// Если выполнить отображение не удалось,
// выводим код ошибки
if(lpFileMap_in == 0)
{
QMessageBox::warning(0,"Error", "Can't display on memory in mapping file");
return 3;
}
// Выполняем отображение файла на память.
// В переменную lpFileMap будет записан указатель на
// отображаемую область памяти
lpFileMap_out = MapViewOfFile(hFileMapping_out,
FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 2);
// Если выполнить отображение не удалось,
// выводим код ошибки
if(lpFileMap_in == 0)
{
QMessageBox::warning(0,"Error", "Can't display on memory out mapping file");
//return 4;
}
QString str="hello";
wchar_t str_end[20];
wchar_t *par;
int count=0;
DWORD dwLenght;
while(count<str.size())
{
dwLenght=str.at(count).toAscii();
*((LPDWORD)lpFileMap_in)=dwLenght;
str_end[count]=(*((LPSTR)lpFileMap_in));
putch(str_end[count]);
count++;
}
if(count==str.size())
{
count=0;
}
}
C++:
/// программа где надо получить доступ к файлу
#include "Mapping_file.h"
// Идентификатор отображения файла на память
HANDLE hFileMapping;
// Указатель на отображенную область памяти
LPVOID lpFileMap;
LPCWSTR lpFileName_in;
LPCWSTR lpFileName_out;
// Идентификатор отображения файла на память
HANDLE hFileMapping_in;
HANDLE hFileMapping_out;
// Указатель на отображенную область памяти
LPVOID lpFileMap_in,lpFileMap_out;
Mapping_file::Mapping_file()
{
// Имя отображния файла на память
lpFileName_in = L"InFileName";
lpFileName_out = L"OutFileName";
// Открываем объект-отображение
hFileMapping = OpenFileMapping(
FILE_MAP_READ | FILE_MAP_WRITE, FALSE, lpFileName_in);
// Если открыть не удалось, выводим код ошибки
if(hFileMapping == NULL)
{
fprintf(stdout,"OpenFileMapping: Error %ld\n",
GetLastError());
getch();
return;
}
// Выполняем отображение файла на память.
// В переменную lpFileMap будет записан указатель на
// отображаемую область памяти
lpFileMap = MapViewOfFile(hFileMapping,
FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
// Если выполнить отображение не удалось,
// выводим код ошибки
if(lpFileMap == 0)
{
fprintf(stdout,"MapViewOfFile: Error %ld\n",
GetLastError());
getch();
return;
}
}
Mapping_file::~Mapping_file()
{
// Отменяем отображение файла
UnmapViewOfFile(lpFileMap);
// Освобождаем идентификатор созданного
// объекта-отображения
CloseHandle(hFileMapping);
}
void Mapping_file::Open_mop_file()
{
wchar_t str_end[20];
int count=0;
DWORD dwLenght;
while(count<20)
{
str_end[count]=(*((LPSTR)lpFileMap_in));
putch(str_end[count]);
count++;
}
}