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]]]] )
$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. |
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(). |
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.
_WinAPI_CloseHandle, _WinAPI_UnmapViewOfFile
Consultez CreateFileMapping 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