Function Reference


_WinAPI_UnmapViewOfFile

Unmaps a mapped view of a file from the calling process's address space

#include <WinAPIFiles.au3>
_WinAPI_UnmapViewOfFile ( $pAddress )

Parameters

$pAddress A pointer to the base address of the mapped view of a file that is to be unmapped.
This value must be identical to the value returned by a previous call to the _WinAPI_MapViewOfFile() function.

Return Value

Success: True
Failure: False

Remarks

Unmapping a mapped view of a file invalidates the range occupied by the view in the address space of the process and makes the range available for other allocations.
It removes the working set entry for each unmapped virtual page that was part of the working set of the process and reduces the working set size of the process.
It also decrements the share count of the corresponding physical page.

Although an application may close the file handle used to create a file mapping object,
the system holds the corresponding file open until the last view of the file is unmapped.
Files for which the last view has not yet been unmapped are held open with no sharing restrictions.

To minimize the risk of data loss in the event of a power failure or a system crash,
you should explicitly flush modified pages using the _WinAPI_FlushViewOfFile() function.

Related

_WinAPI_FlushViewOfFile, _WinAPI_MapViewOfFile

See Also

Search UnmapViewOfFile in MSDN Library.

Example

#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(($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(($MB_ICONERROR + $MB_SYSTEMMODAL), 'Error', 'Unable to create file mapping (@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)", 'Type some text message.', '', '', -1, 171), BitOR($STR_STRIPLEADING, $STR_STRIPTRAILING))
                If Not $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