Никак не пойму - в чем ошибка?
Код:
const char MFName_r[] = "1223_r"; // Название файла для File Mapping для чтения
const char MFName_w[] = "1223_w"; // Название файла для File Mapping для чтения
// Структуры
struct FMP_struct{
HANDLE readfile;
HANDLE writefile;
int* read;
int* write;
} FMP;
/////////////////////////////////////////////////////////////////////
// //
// Работа с File Mapping
// //
/////////////////////////////////////////////////////////////////////
// Создание Map файла
void LetMeMapFlie(){
// Создаем файлы
FMP.writefile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 255, MFName_w);
FMP.readfile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READONLY, 0, 255, MFName_r);
// Открываем файлы
FMP.write = (int*)MapViewOfFile(FMP.writefile, FILE_MAP_WRITE, 0,0,0);
FMP.read = (int*)MapViewOfFile(FMP.readfile, FILE_MAP_READ, 0,0,0);
}
// Считать CHAR из MAP
unsigned char ReadChar_SlimRG(){
return (char)FMP.read[0];
}
// Считать INT из MAP
int ReadInt_SlimRG(){
return (int)FMP.read[0];
}
// Записать INT в MAP
void WriteInt_SlimRG(int key){
FMP.writefile[0] = (int)key;
}
// Записать CHAR в MAP
void WriteChar_SlimRG(unsigned char key){
FMP.writefile[0]) = (int)key;
}
Пишет - subscript of pointer to incomplete type 'void'
И выделяет:
void WriteInt_SlimRG(int key){
FMP.writefile[0] = key;
}
и
void WriteChar_SlimRG(unsigned char key){
FMP.writefile[0]) = (int)key;
}
Потому что обращение к памяти должно идти по адресу FMP.write
, а не к хэндлу FMP.writefile
Попробуйте делать так, и обратите внимание на явное приведения типов:
#include <Windows.h>
#include <iostream>
typedef struct memory_mapped_file
{
explicit memory_mapped_file(const size_t file_size) :
read_handle(nullptr),
write_handle(nullptr),
read_ptr(nullptr),
write_ptr(nullptr)
{
write_handle = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, file_size, L"mm_file_rw");
read_handle = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READONLY, 0, file_size, L"mm_file_ro");
read_ptr = MapViewOfFile(read_handle, FILE_MAP_READ, 0, 0, file_size);
write_ptr = MapViewOfFile(write_handle, FILE_MAP_WRITE, 0, 0, file_size);
// Необходимо доработать обработку невалидных хэндлов
}
~memory_mapped_file()
{
if (read_handle != INVALID_HANDLE_VALUE && read_handle != nullptr)
{
UnmapViewOfFile(read_handle);
CloseHandle(read_handle);
}
if (write_handle != INVALID_HANDLE_VALUE && write_handle != nullptr)
{
UnmapViewOfFile(write_handle);
CloseHandle(write_handle);
write_handle = nullptr;
}
}
template <typename T>
void write(const T data, const size_t offset = 0)
{
T* writable = static_cast<T*>(write_ptr);
writable[offset] = data;
}
template <typename T>
T read(const size_t offset = 0)
{
T* result = static_cast<T*>(write_ptr);
return result[offset];
}
HANDLE read_handle;
HANDLE write_handle;
void* read_ptr;
void* write_ptr;
// delete unusable operators and constructors as non-copy object
memory_mapped_file(const memory_mapped_file&) = delete;
memory_mapped_file(const memory_mapped_file&&) = delete;
memory_mapped_file& operator=(const memory_mapped_file& other) = delete;
memory_mapped_file&& operator=(const memory_mapped_file&& other) = delete;
} mm_file;
int main(int argc, char* argv[])
{
mm_file mmf(sizeof(int) + sizeof(float));
mmf.write<int>(20);
mmf.write(35.876f, sizeof(int));
std::cout << "mmf read result: (int = " << mmf.read<int>() << "), (float = " << mmf.read<float>(sizeof(int)) << ")" << std::endl;
}
Такая структура упростит вам жизнь, но вам необходимо все-таки вручную вычислять оффсеты, можно придумать какой-нибудь механизм, который бы делал вычисление за вас.
Результатом выполнения будет:
mmf read result: (int = 20), (float = 35.876)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Возникла потребность синхронизации данных с sqlite в postgresqlКоротко говоря все происходит так: sqlite (embeded система) собирает данные и при возможности...
Может кто порекомендовать ресурсы по изучению мавен как утилиты терминала? Попадавшиеся мне туториалы были в виде "нажмите это, нажмите то
Есть задача: получить изображение с камеры, выделить нужный объект для слежения и следить за ним
Я установил себе в приложение PlaceAutocomplete и получаю с него latitude и longitudeВсе работает отлично