SharedMemoryImpl::SharedMemoryImpl(const Poco::File& file, SharedMemory::AccessMode mode, const void*): _name(file.path()), _memHandle(INVALID_HANDLE_VALUE), _fileHandle(INVALID_HANDLE_VALUE), _size(0), _mode(PAGE_READONLY), _address(0) { if (!file.exists() || !file.isFile()) throw FileNotFoundException(_name); _size = static_cast<DWORD>(file.getSize()); DWORD shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; DWORD fileMode = GENERIC_READ; if (mode == SharedMemory::AM_WRITE) { _mode = PAGE_READWRITE; fileMode |= GENERIC_WRITE; } #if defined (POCO_WIN32_UTF8) std::wstring utf16name; UnicodeConverter::toUTF16(_name, utf16name); _fileHandle = CreateFileW(utf16name.c_str(), fileMode, shareMode, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); #else _fileHandle = CreateFileA(_name.c_str(), fileMode, shareMode, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); #endif if (_fileHandle == INVALID_HANDLE_VALUE) throw OpenFileException("Cannot open memory mapped file", _name); _memHandle = CreateFileMapping(_fileHandle, NULL, _mode, 0, 0, NULL); if (!_memHandle) { CloseHandle(_fileHandle); _fileHandle = INVALID_HANDLE_VALUE; throw SystemException("Cannot map file into shared memory", _name); } map(); }
SharedMemoryImpl::SharedMemoryImpl(const Poco::File& file, SharedMemory::AccessMode mode, const void* addrHint): _size(0), _fd(-1), _address(0), _access(mode), _name(file.path()), _fileMapped(true), _server(false) { if (!file.exists() || !file.isFile()) throw FileNotFoundException(file.path()); _size = file.getSize(); int flag = O_RDONLY; if (mode == SharedMemory::AM_WRITE) flag = O_RDWR; _fd = ::open(_name.c_str(), flag); if (-1 == _fd) throw OpenFileException("Cannot open memory mapped file", _name); map(addrHint); }