Scrivere nella memoria condivisa
-
07-07-2019 - |
Domanda
Come posso scrivere da un file nella memoria condivisa usando l'API Win32?
Ho questo codice:
hFile = CreateFile("input.map",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
hMapFile = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
0,
TEXT("SharedObject"));
lpMapAddress = (LPTSTR) MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
ReadFile(
hFile,
lpMapAddress,
75,
&bytesRead,
NULL);
sprintf((char*)lpMapAddress, "<output 1>");
printf((char*) lpMapAddress);
Tuttavia, la chiamata printf restituisce solo " < uscita 1 > " e non il contenuto del file.
EDIT: Trovato il problema Sto scrivendo nel file di input quando chiamo sprintf. Ma ancora non so perché ...
Soluzione
È l'intero esempio di codice? Mi sembra che la chiamata a sprintf
inserisca una stringa con terminazione null in lpMapAddress
, che sovrascrive effettivamente qualsiasi cosa tu legga dal file - almeno ai fini della tua printf
istruzione.
Se vuoi sostituire la prima parte di ciò che leggi con la stringa "<output 1>"
, puoi farlo dopo aver letto il file:
char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));
Che copia il testo della stringa ma non il suo terminatore null.
Altri suggerimenti
Il sprintf
memorizza un NUL dopo <output 1>
e printf
si ferma al primo NUL.
(Inoltre, è una cattiva idea passare un file casuale come formato a %
. E se contenesse MapViewOfFile
caratteri? Ma questo è un altro problema.)
Sto scrivendo nel file di input quando chiama sprintf. Ma ancora non lo so perché ...
Perché è quello che <=> fa . Associa il contenuto del file a un blocco di memoria. Il contenuto corrente del file viene visualizzato nel blocco di memoria e tutte le modifiche apportate a tale memoria vengono scritte nel file.
Non credo che sia necessario chiamare ReadFile dopo il mapping. Accedi al contenuto da lpMapAddress.
Tuttavia, l'uso delle costanti per MapViewOfFile non fa alcun vantaggio dall'uso del mapping dei file di memoria.
Non capisco davvero cosa stai arrivando qui. Non importa quale codice hai inserito prima; L'ultima riga è sempre che restituirà la stringa inserita nel buffer nella precedente & Quot; sprintf & Quot; linea. Dato che è & Quot; <output 1>
& Quot ;, sì, è quello che verrà restituito.