UDF > WinAPIEx > Files & Devices > Files >


_WinAPI_UnmapViewOfFile

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 )

Paramètre

$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().

Valeur de retour

Succès: Retourne True
Échec: Retourne False

Remarques

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().

En relation

_WinAPI_FlushViewOfFile, _WinAPI_MapViewOfFile

Voir aussi

Consultez UnmapViewOfFile dans la librairie MSDN.

Exemple

#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