CreateFileMapping () – parâmetros de tamanho
On Fevereiro 10, 2021 by adminEu quero fazer um programa, que irá colocar alguma frase na memória compartilhada para que outro programa receba esta massagem. Fiz isso, mas não entendo o 4º e o 5º parâmetros de CreateFileMapping ().
No meu programa, escrevo 256 (5º parâmetro), mas quando mudei para 1, o programa ainda funcionava. Achei que deveria travar, porque presumo que dwMaximumSizeLow seja o tamanho mais baixo. Quando coloco algum valor no 4º argumento, o programa falha. Achei que esse valor deveria ser maior no 5º, mas me enganei.
Meu código:
#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; }
Você poderia explicar como o 4º e o quinto parâmetro de CreateFileMapping () funciona?
Comentários
- Você está nos pedindo para encontrar a Microsoft ' s documentação desta função para você? (isso é fácil para o Google) Ou uma explicação do que significam certas partes da documentação? (você poderia incluir citações das partes exatas que não ' entender? Eu poderia adivinhar, mas eu ' d provavelmente adivinhei errado). também ' não entenda como esse snippet de código é relevante para sua pergunta se você ' estiver perguntando apenas como uma única função funciona.
- Estou perguntando sobre o 4º e o 5º parâmetros de CreateFileMapping (), porque não ' não entendo como funciona. Pela documentação, pensei que dwMaximumSizeHigh é o tamanho mais alto dos dados na memória compartilhada e dwMaximumSizeLow é o tamanho mais baixo dos dados. Queria verificar como funciona e mudei o valor no 5º parâmetro em 1 programa que ainda funcionava. E eu não ' não sei por quê, porque é o programa de menor tamanho deve travar.
Resposta
A documentação explica muito bem o quarto e o quinto parâmetros, dwMaximumSizeHigh
e dwMaximumSizeLow
. No entanto, eles não são o maior e o menor tamanho possível dos dados, como você espera. Eles são a ordem superior e a parte inferior do mesmo, cada um sendo uma parte de 32 bits do tamanho de 64 bits:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Então, se você colocar 256 em ambos os valores, sua memória compartilhada será 256 * 4294967295 + 256 = 1 099 511 627 776 bytes! Isso será de 1099 GB. Tem certeza de que tem capacidade para isso?
Por que não trava se o tamanho da memória compartilhada é muito pequeno?
Quando você reduz o tamanho para 1 e grava mais bytes na memória compartilhada, você pode corromper a memória. Pode passar despercebido.
Não falha, certamente porque os segfaults são detectados através do sistema de paging, e uma página típica no Windows tem 4Kb. Sua mensagem de exemplo é muito pequena para o sistema de paging perceber que o endereço solicitado vai fora dos limites.
Comentários
- A documentação da Microsoft não é clara para mim, mas esta resposta esclarece o que são ordens altas e ordens baixas.
Deixe uma resposta