CreateFileMapping () – parametri di dimensione
Su Febbraio 10, 2021 da adminVoglio creare un programma, che metterà alcune frasi nella memoria condivisa in modo che un altro programma riceva questo messaggio. Lho fatto, ma non capisco il 4 ° e il 5 ° parametro di CreateFileMapping ().
Nel mio programma scrivo 256 (quinto parametro), ma quando lho cambiato in 1, il programma funzionava ancora. Ho pensato che dovesse bloccarsi, perché presumo che dwMaximumSizeLow sia la dimensione più bassa. Quando metto un valore nel quarto argomento il programma va in crash. Pensavo che questo valore dovesse essere più alto del 5 °, ma mi sbagliavo.
Il mio codice:
#include <iostream> #include <Windows.h> const char name[256] = "Map1"; const char massage[256] = "Welcome in the world without rules"; int main() { using std::cout; using std::cin; using std::endl; HANDLE hMap; hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 256, (LPCTSTR)name); if (!hMap) { cout << "create error" << endl; return 1; } char * data = (char*) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, NULL, NULL,NULL); if (!data) { cout << "mapview error" << endl; return 1; } if (!(CopyMemory(data, massage, sizeof(char) * 256)) ) { cout << "copy error" << endl; } cin.get(); UnmapViewOfFile(hMap); CloseHandle(hMap); return 0; }
Potresti spiegare come il 4 ° e il quinto parametro di CreateFileMapping () funzionano?
Commenti
- Ci stai chiedendo di trovare Microsoft ' div documentazione di questa funzione per te? (questo è facile per Google) O una spiegazione di cosa significano alcune parti della documentazione? (potresti includere virgolette delle parti esatte che non sei riuscito a ' capire? Potrei indovinare, ma ' probabilmente avrei sbagliato) I inoltre non ' capire in che modo questo snippet di codice è pertinente alla tua domanda se ' stai chiedendo solo come funziona una singola funzione.
- Sto chiedendo informazioni sul 4 ° e 5 ° parametro di CreateFileMapping (), perché ' non capisco come funziona. Dalla documentazione ho pensato, che dwMaximumSizeHigh è la dimensione massima dei dati nella memoria condivisa e dwMaximumSizeLow è la dimensione minima dei dati. Quindi volevo controllare come funziona e ho cambiato il valore nel 5 ° parametro su 1 programma ancora funzionante. E non ' non so perché, perché è il programma di dimensioni più basse che dovrebbe bloccarsi.
Risposta
La documentazione spiega molto bene il quarto e il quinto parametro, dwMaximumSizeHigh
e dwMaximumSizeLow
. Tuttavia, non sono le dimensioni massime e minime possibili dei dati, come previsto. Sono la parte di ordine elevato e quella inferiore dello stesso, essendo ciascuna una parte a 32 bit della dimensione a 64 bit:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Quindi, se metti 256 in entrambi questi valori, la memoria condivisa sarà 256 * 4294967295 + 256 = 1099 511 627 776 byte! Saranno 1099 GB. Sei sicuro di avere la capacità per quello?
Perché non si blocca se la dimensione della memoria condivisa è troppo piccolo?
Quando riduci la dimensione a 1 e scrivi più byte nella memoria condivisa, potresti danneggiare la memoria. Potrebbe rimanere inosservato.
Non si blocca, certamente perché i segfaults vengono rilevati tramite il sistema di paging e una tipica pagina su Windows è 4Kb. Il tuo messaggio di esempio è troppo piccolo perché il sistema di paging possa notare che lindirizzo richiesto va fuori dai limiti.
Commenti
- La documentazione di Microsoft non mi è chiara mentre questa risposta chiarisce cosa siano ordine alto e ordine basso.
Lascia un commento