13using namespace Qt::StringLiterals;
15#if QT_CONFIG(sharedmemory)
17void QSharedMemoryPrivate::setWindowsErrorString(QLatin1StringView function)
19 DWORD windowsError = GetLastError();
20 if (windowsError == 0)
22 switch (windowsError) {
23 case ERROR_ALREADY_EXISTS:
24 error = QSharedMemory::AlreadyExists;
25 errorString = QSharedMemory::tr(
"%1: already exists").arg(function);
27 case ERROR_FILE_NOT_FOUND:
28 error = QSharedMemory::NotFound;
29 errorString = QSharedMemory::tr(
"%1: doesn't exist").arg(function);
31 case ERROR_COMMITMENT_LIMIT:
32 error = QSharedMemory::InvalidSize;
33 errorString = QSharedMemory::tr(
"%1: invalid size").arg(function);
35 case ERROR_NO_SYSTEM_RESOURCES:
36 case ERROR_NOT_ENOUGH_MEMORY:
37 error = QSharedMemory::OutOfResources;
38 errorString = QSharedMemory::tr(
"%1: out of resources").arg(function);
40 case ERROR_ACCESS_DENIED:
41 error = QSharedMemory::PermissionDenied;
42 errorString = QSharedMemory::tr(
"%1: permission denied").arg(function);
45 errorString = QSharedMemory::tr(
"%1: unknown error: %2")
46 .arg(function, qt_error_string(windowsError));
47 error = QSharedMemory::UnknownError;
48#if defined QSHAREDMEMORY_DEBUG
49 qDebug() << errorString <<
"key" << key;
54HANDLE QSharedMemoryWin32::handle(QSharedMemoryPrivate *self)
57 const auto function =
"QSharedMemory::handle"_L1;
58 if (self->nativeKey.isEmpty()) {
59 self->setError(QSharedMemory::KeyError,
60 QSharedMemory::tr(
"%1: unable to make key").arg(function));
63 hand = OpenFileMapping(FILE_MAP_ALL_ACCESS,
false,
64 reinterpret_cast<
const wchar_t *>(self->nativeKey.nativeKey().utf16()));
66 self->setWindowsErrorString(function);
73bool QSharedMemoryWin32::cleanHandle(QSharedMemoryPrivate *)
75 if (hand != 0 && !CloseHandle(hand)) {
83bool QSharedMemoryWin32::create(QSharedMemoryPrivate *self, qsizetype size)
85 const auto function =
"QSharedMemory::create"_L1;
86 if (self->nativeKey.isEmpty()) {
87 self->setError(QSharedMemory::KeyError,
88 QSharedMemory::tr(
"%1: key error").arg(function));
94 if constexpr (
sizeof(qsizetype) == 8)
95 high = DWORD(quint64(size) >> 32);
98 low = DWORD(size_t(size) & 0xffffffff);
99 hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, high, low,
100 reinterpret_cast<
const wchar_t *>(self->nativeKey.nativeKey().utf16()));
101 self->setWindowsErrorString(function);
104 return self->error != QSharedMemory::AlreadyExists && hand;
107bool QSharedMemoryWin32::attach(QSharedMemoryPrivate *self, QSharedMemory::AccessMode mode)
110 int permissions = (mode == QSharedMemory::ReadOnly ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS);
111 self->memory = (
void *)MapViewOfFile(handle(self), permissions, 0, 0, 0);
113 self->setWindowsErrorString(
"QSharedMemory::attach"_L1);
119 MEMORY_BASIC_INFORMATION info;
120 if (!VirtualQuery(self->memory, &info,
sizeof(info))) {
123 self->setError(QSharedMemory::UnknownError,
124 QSharedMemory::tr(
"%1: size query failed")
125 .arg(
"QSharedMemory::attach: "_L1));
128 self->size = qsizetype(info.RegionSize);
133bool QSharedMemoryWin32::detach(QSharedMemoryPrivate *self)
136 if (!UnmapViewOfFile(self->memory)) {
137 self->setWindowsErrorString(
"QSharedMemory::detach"_L1);
144 return cleanHandle(self);
Combined button and popup list for selecting options.