UDF > WinAPIEx > Files & Devices > Files >


_WinAPI_CreateFileMapping

Crée ou ouvre un objet de mappage de fichier, nommé ou non, pour un fichier spécifié

#include <WinAPIFiles.au3>
_WinAPI_CreateFileMapping ( $hFile [, $iSize = 0 [, $sName = '' [, $iProtect = 0x0004 [, $tSecurity = 0]]]] )

Paramètres

$hFile Handle du fichier à partir duquel créer un objet de mappage de fichier.
Si ce paramètre est (-1), le processus appelant doit également spécifier une taille de l'objet de mappage de fichier dans le paramètre $iSize.
Dans ce scénario, _WinAPI_CreateFileMapping() crée un objet de mappage de fichier d'une taille spécifiée qui est soutenue par le fichier d'échange du système au lieu d'un fichier dans le système de fichiers.
$iSize [optionnel] La taille maximale de l'objet de mappage de fichier.
Si ce paramètre est 0 (par défaut), la taille maximale de l'objet de mappage de fichier est égale à la taille actuelle du fichier identifié par $hFile.
$sName [optionnel] Le nom de l'objet de mappage de fichier.
$iProtect [optionnel] Spécifie la protection de la page de l'objet de mappage de fichier et peut prendre l'une des valeurs suivantes:
    $PAGE_EXECUTE_READ
    $PAGE_EXECUTE_READWRITE
    $PAGE_EXECUTE_WRITECOPY
    $PAGE_READONLY
    $PAGE_READWRITE (par défaut)
    $PAGE_WRITECOPY

Une application peut spécifier un ou plusieurs des attributs suivants pour l'objet de mappage de fichier en les combinant à l'une des valeurs de protection de la page précédente.
    $SEC_COMMIT
    $SEC_IMAGE
    $SEC_LARGE_PAGES
    $SEC_NOCACHE
    $SEC_RESERVE
    $SEC_WRITECOMBINE
$tSecurity [optionnel] La structure $tagSECURITY_ATTRIBUTES qui détermine si le handle retourné peut être hérité par des processus enfants.
Si ce paramètre est 0 (par défaut), le handle ne peut pas être héritée et l'objet de mappage de fichier obtient un descripteur de sécurité par défaut.

Valeur de retour

Succès: Retourne le handle à l'objet de mappage de fichier nouvellement créé.
Si l'objet existe avant l'appel de fonction, la fonction retourne le handle de l'objet existant (avec sa taille actuelle, pas la taille spécifiée), et définit @extended à $ERROR_ALREADY_EXISTS (183).
Échec: Retourne 0, @extended est défini avec _WinAPI_GetLastError().

Remarques

Après qu'un objet de mappage de fichier soit créé, la taille du fichier ne doit pas dépasser la taille de l'objet de mappage de fichier; si c'est le cas, la totalité du contenu de fichier n'est sont pas disponibles pour le partage.

Plusieurs processus peuvent partager une vue du même fichier, soit en utilisant un seul objet de mappage de fichier partagé, soit en créant des objets de mappage de fichiers distincts soutenus par le même fichier. Un objet de mappage de fichier peut être partagé par plusieurs processus à travers l'héritage du handle à la création de processus, en dupliquant le handle, ou en ouvrant l'objet de mappage de fichier par son nom.

Un objet de mappage de fichier ne mappe pas la vue dans un espace d'adressage du processus. La fonction _WinAPI_MapViewOfFile() mappe une vue d'un fichier dans un espace d'adressage du processus.

Les vues mappées d'un objet de mappage de fichier maintiennent des références internes à l'objet, et un objet de mappage de fichier ne se ferme pas jusqu'à ce que toutes les références à celui-ci soient libérées.
Par conséquent, pour fermer complètement un objet de mappage de fichier, une application doit démapper toutes les vues mappées de l'objet de mappage de fichier en appelant _WinAPI_UnmapViewOfFile() et fermer le handle de l'objet de mappage en appelant _WinAPI_CloseHandle().
Ces fonctions peuvent être appelées dans n'importe quel ordre.

En relation

_WinAPI_CloseHandle, _WinAPI_UnmapViewOfFile

Voir aussi

Consultez CreateFileMapping 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