2013-02-07 5 views
7

Ho un'applicazione che ha una zona di memoria condivisa definita con CreateFileMapping e sto provando a leggere quella memoria da un'altra applicazione.Perché CreateFileMapping restituisce "il file esiste già"?

ho provato questo:

handle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 
      0,$3200, pchar('FileMappingZone')); 

Ma ottengo:

Impossibile creare un file quando il file esiste già

quello che potrebbe essere il problema?

+2

Il tuo wrapper attorno a winapi chiama incondizionatamente 'GetLastError' dopo ogni chiamata? È previsto per 'CreateFileMapping' per restituire un handle valido ** e ** per il seguente' GetLastError' per restituire 'ERROR_ALREADY_EXISTS' (che in realtà non è un errore se è quello che ci si aspetta). –

+0

Ho chiamato GetLastError subito dopo la chiamata su CreateFileMapping, se chiudo l'applicazione che ha creato il mapping file prima che venga indicato: Operazione completata correttamente – opc0de

+0

@ opc0de Non farlo. Chiama solo "GetLastError" quando la documentazione dice di farlo. E questo è quando 'CreateFileMapping' restituisce' NULL'. –

risposta

15

Non tutto ciò che imposta il valore GetLastError() in caso di non riuscita è un errore. È importante distinguere gli errori in base al valore restituito dalla funzione e esaminare GetLastError() per ottenere ulteriori informazioni sul tipo di errore .

Per mappature già esistenti, CreateFileMapping è documentato per restituire un handle valido e per impostare GetLastError() valore ERROR_ALREADY_EXISTS. In questo caso, il valore di errore è informativo: è valido esaminarlo se sei interessato a verificare se il mapping fosse esistente prima di averlo aperto, ma non si tratta di un errore. Rileva failure testando il valore restituito per essere NULL. Altrimenti, vai avanti e usa la maniglia.

P.S. Se vuoi assicurarti che la sezione esista prima di aprire, puoi usare OpenFileMapping che fallirà per le sezioni non esistenti invece di crearne una nuova.

+0

In questo caso, l'app di condivisione chiamerebbe 'CreateFileMapping()' per condividere i dati e l'app di lettura dovrebbe usare 'OpenFileMapping()' invece di 'CreateFileMapping()' per leggere i dati condivisi. Se 'OpenFileMapping()' fallisce, l'app di condivisione non condivide alcun dato (a meno che non si verifichi un altro errore, come l'app di lettura che non dispone delle autorizzazioni per accedere alla mappatura dell'app di condivisione). Non avrei un'applicazione di lettura per creare il mapping se non esiste già, a meno che non intenda condividere i propri dati. –

+0

Avrei bisogno di un'applicazione di lettura per creare il mapping se voglio che siano in grado di iniziare in qualsiasi ordine (e non aspettare/riprovare con le possibili razze), che a volte è importante. L'esempio di OP fornisce una dimensione per la mappatura dei file, quindi ovviamente sa che altre applicazioni sono abbastanza intimamente da prendere una decisione. –