ОБСУЖДЕНИЕ

Файлы Проецируемые На Память

0 ответов 4,5 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Здравствуйте. помогите пожалуйста решить такую проблему. делаю обмен между программа через файлы проецируемые на память. В программе где файл создается чтение и запись делается. а вот во второй программе, где файл открывается при попытке чтения программа сразу вылетает в 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++;
}

}
 
Статус
Закрыто для дальнейших ответов.