Creazione di un oggetto Mapping file
Il primo passaggio nel mapping di un file consiste nell'aprire il file chiamando la funzione CreateFile . Per assicurarsi che altri processi non possano scrivere nella parte del file mappato, è necessario aprire il file con accesso esclusivo. Inoltre, l'handle di file deve rimanere aperto fino a quando il processo non necessita più dell'oggetto mapping dei file. Un modo semplice per ottenere l'accesso esclusivo consiste nel specificare zero nel parametro fdwShareMode di CreateFile. L'handle restituito da CreateFile viene usato dalla funzione CreateFileMapping per creare un oggetto mapping di file.
La funzione CreateFileMapping restituisce un handle all'oggetto mapping dei file. Questo handle verrà usato durante la creazione di una visualizzazione file in modo che sia possibile accedere alla memoria condivisa. Quando si chiama CreateFileMapping, si specifica un nome dell'oggetto, il numero di byte da eseguire il mapping dal file e l'autorizzazione di lettura/scrittura per la memoria mappata. Il primo processo che chiama CreateFileMapping crea l'oggetto mapping dei file. Processi che chiamano CreateFileMapping per un oggetto esistente ricevono un handle per l'oggetto esistente. È possibile stabilire se una chiamata riuscita a CreateFileMapping creata o aperta l'oggetto mapping file chiamando la funzione GetLastError . GetLastError restituisce NO_ERROR al processo di creazione e ERROR_ALREADY_EXISTS ai processi successivi.
La funzione CreateFileMapping ha esito negativo se i flag di accesso sono in conflitto con quelli specificati quando la funzione CreateFile ha aperto il file. Ad esempio, per leggere e scrivere nel file:
- Specificare i valori GENERIC_READ e GENERIC_WRITE nel parametro fdwAccess di CreateFile.
- Specificare il valore PAGE_READWRITE nel parametro fdwProtect di CreateFileMapping.
La creazione di un oggetto mapping di file non esegue il commit della memoria fisica, la riserva solo.
Dimensioni mapping file
Le dimensioni dell'oggetto mapping dei file sono indipendenti dalle dimensioni del file mappato. Tuttavia, se l'oggetto mapping file è maggiore del file, il sistema espande il file prima che CreateFileMapping restituisca. Se l'oggetto mapping dei file è minore del file, il sistema esegue il mapping solo del numero specificato di byte dal file.
I parametri dwMaximumSizeHigh e dwMaximumSizeLow di CreateFileMapping consentono di specificare il numero di byte da eseguire il mapping dal file:
Quando non si desidera modificare le dimensioni del file, ad esempio quando si esegue il mapping dei file di sola lettura, chiamare CreateFileMapping e specificare zero per dwMaximumSizeHigh e dwMaximumSizeLow. In questo modo viene creato un oggetto di mapping dei file che corrisponde esattamente alla stessa dimensione del file. In caso contrario, è necessario calcolare o stimare le dimensioni del file completato perché gli oggetti di mapping dei file sono statici in dimensioni; una volta creata, le dimensioni non possono essere aumentate o ridotte. Un tentativo di eseguire il mapping di un file con lunghezza pari a zero in questo modo non riesce con un codice di errore di ERROR_FILE_INVALID. I programmi devono testare i file con lunghezza pari a zero e rifiutare tali file.
Le dimensioni di un oggetto mapping di file supportato da un file denominato sono limitate dallo spazio su disco. Le dimensioni di una visualizzazione file sono limitate al blocco contiguo più grande disponibile di memoria virtuale non disponibile. Si tratta di almeno 2 GB meno la memoria virtuale già riservata dal processo.
Le dimensioni dell'oggetto mapping dei file selezionate controllano la distanza nel file che è possibile "visualizzare" con il mapping di memoria. Se si crea un oggetto mapping di file con dimensioni pari a 500 Kb, è possibile accedere solo ai primi 500 Kb del file, indipendentemente dalle dimensioni del file. Poiché non costa risorse di sistema per creare un oggetto mapping di file più grande, creare un oggetto mapping di file che corrisponde alle dimensioni del file (impostare i parametri dwMaximumSizeHigh e dwMaximumSizeLow di CreateFileMapping entrambi su zero) anche se non si prevede di visualizzare l'intero file. Il costo delle risorse di sistema è disponibile per creare le visualizzazioni e accedervi.
È possibile visualizzare una parte del file che non inizia all'inizio del file. Per altre informazioni, vedere Creazione di una visualizzazione all'interno di un file.
Argomenti correlati