Escrevendo a memória compartilhada
-
07-07-2019 - |
Pergunta
Como posso escrever a partir de um arquivo de memória compartilhada usando a API Win32?
Eu tenho esse código:
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);
No entanto, a chamada printf apenas retorna "
EDIT: Encontrado o problema. Estou escrevendo para o arquivo de entrada quando eu chamo sprintf. Mas eu ainda não sei porque ...
Solução
Esta é toda a amostra de código? Parece-me que a chamada para sprintf
coloca uma string terminada em nulo no lpMapAddress
, o que efetivamente substitui o que você ler o arquivo -., Pelo menos para efeitos da sua declaração printf
Se você quiser substituir a primeira parte do que você lê com o "<output 1>"
corda, você poderia fazer isso depois de ler o arquivo:
char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));
que copia o texto da string mas não o seu terminador nulo.
Outras dicas
As lojas sprintf
um NUL após <output 1>
e printf
pára no primeiro NUL.
(Além disso, é uma má idéia para passar algum arquivo aleatório como o formato a printf
. E se ele continha caracteres %
? Mas isso é outra questão.)
Estou escrevendo para o arquivo de entrada quando eu sprintf chamada. Mas eu ainda não sei por isso ...
Porque é isso que MapViewOfFile
faz . Ele associa o conteúdo do arquivo com um bloco de memória. Os conteúdos atuais do arquivo aparecem no bloco de memória, e todas as alterações feitas para que a memória são gravados no arquivo.
Eu não acho que você precisa chamar ReadFile após o mapeamento. Basta acessar o conteúdo do lpMapAddress.
No entanto, usando as constantes para MapViewOfFile faz nenhum benefício do uso de mapeamento de arquivo de memória.
Eu realmente não entendo o que você está chegando aqui. Não importa o que o código que você colocou antes; Essa última linha é sempre vai retornar a string que você colocou no buffer na linha anterior "sprintf". Desde que é "<output 1>
", sim é isso que vai ser devolvido.