Supprime le mappage d'une vue mappée d'un fichier à partir de l'espace d'adressage du processus appelant
#include <WinAPIFiles.au3>
_WinAPI_UnmapViewOfFile ( $pAddress )
$pAddress | Le pointeur sur l'adresse de base d'une vue mappée du fichier dont vous voulez supprimer le mappage. Cette valeur doit être identique à la valeur retournée par un appel précédent à la fonction _WinAPI_MapViewOfFile(). |
Succès: | Retourne True |
Échec: | Retourne False |
La suppression du mappage d'un fichier invalide la plage occupée par la vue dans l'espace d'adressage du processus et rend la plage disponible pour d'autres allocations.
Elle supprime l'entrée de la plage de travail pour chaque page virtuelle concernée qui faisait partie de la plage de travail du processus et réduit la taille de la plage de travail du processus.
Elle décrémente aussi le nombre total de page physique correspondante.
Bien qu'une application peut fermer le handle de fichier utilisé pour créer un objet de mappage de fichier, le système maintient le fichier correspondant ouvert jusqu'à ce que la dernière vue du fichier ne soit plus mappée.
Les fichiers pour lesquels la dernière vue n'a pas encore été démappée sont maintenues ouvertes sans aucune restriction de partage.
Pour minimiser le risque de perte de données en cas de panne de courant ou un plantage du système, vous devriez explicitement 'flusher' les pages modifiées en utilisant la fonction _WinAPI_FlushViewOfFile().
_WinAPI_FlushViewOfFile, _WinAPI_MapViewOfFile
Consultez UnmapViewOfFile dans la librairie MSDN.
#NoTrayIcon #include <MsgBoxConstants.au3> #include <WinAPIFiles.au3> #include <WinAPIHObj.au3> Opt('WinWaitDelay', 0) Global Const $g_sTitle = '_WinAPI_MapViewOfFile' & ChrW(160) If Not $CmdLine[0] Then If WinExists($g_sTitle) Then Exit EndIf For $i = 1 To 2 If Not @Compiled Then Run(@AutoItExe & '"' & @ScriptFullPath & '" /' & $i) Else Run(@AutoItExe & '/' & $i) EndIf Sleep(500) Next Exit EndIf Opt('TrayIconHide', 0) Switch $CmdLine[1] Case '/1' _Sender() Case '/2' _Receiver() Case Else Exit EndSwitch Func _Receiver() Local $hMapping = _WinAPI_OpenFileMapping('MyFileMapping') If Not $hMapping Then Return Local $pAddress = _WinAPI_MapViewOfFile($hMapping) Local $tData = DllStructCreate('wchar[1024]', $pAddress) Local $sText While WinWait($g_sTitle, '', 1) Sleep(200) $sText = DllStructGetData($tData, 1) DllStructSetData($tData, 1, '') If $sText Then MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL), $g_sTitle & " (receiver)", " " & @CRLF & $sText) WEnd _WinAPI_UnmapViewOfFile($pAddress) _WinAPI_CloseHandle($hMapping) EndFunc ;==>_Receiver Func _Sender() Local $hMapping = _WinAPI_CreateFileMapping(-1, 2048, 'MyFileMapping') If Not $hMapping Or @extended Then MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Impossible de créer le mappage du fichier (@extended=' & @extended & ').') Return EndIf Local $pAddress = _WinAPI_MapViewOfFile($hMapping) Local $tData = DllStructCreate('wchar[1024]', $pAddress) Local $sText While WinWaitClose($g_sTitle) $sText = StringStripWS(InputBox($g_sTitle & " (sender)", 'Tapez du texte.', '', '', -1, 171), 3) If $sText = "" Then ExitLoop EndIf DllStructSetData($tData, 1, $sText) If Not WinWait($g_sTitle, '', 1) Then ExitLoop EndIf WEnd _WinAPI_UnmapViewOfFile($pAddress) _WinAPI_CloseHandle($hMapping) EndFunc ;==>_Sender