Erzeugt oder öffnet ein benanntes oder unbenanntes File-Mapping-Objekt für eine angegebene Datei.
#include <WinAPIFiles.au3>
_WinAPI_CreateFileMapping ( $hFile [, $iSize = 0 [, $sName = '' [, $iProtect = $PAGE_READWRITE [, $tSecurity = 0]]]] )
| $hFile | Handle der Datei von welcher das File-Mapping-Objekt erzeugt werden soll. Wenn dieser Parameter (-1) ist, so muss der aufrufende Prozess die Größe für das File-Mapping-Objekt im $iSize Parameter angeben. In diesem Falle erzeugt _WinAPI_CreateFileMapping() ein File-Mapping-Objekt mit einer bestimmten Größe welches von der Systemseitendatei statt einer Datei im Dateisystem unterstützt wird. |
| $iSize | [optional] Die maximale Größe des File-Mapping-Objektes. Wenn dieser Parameter 0 ist (Standard), so ist die maximale Größe des File-Mapping-Objektes gleich der aktuellen Datei welches $hFile identifiziert. |
| $sName | [optional] Der Name des File-Mapping-Objektes. |
| $iProtect | [optional] Gibt den Seitenschutz des File-Mapping-Objektes an und kann einen der folgenden Werte annehmen: $PAGE_EXECUTE_READ $PAGE_EXECUTE_READWRITE $PAGE_EXECUTE_WRITECOPY $PAGE_READONLY $PAGE_READWRITE (Standard) $PAGE_WRITECOPY Eine Anwendung kann einen oder mehrere der folgenden Attribute für das File-Mapping-Objekt angeben und mit den vorgegangenen Seitenschutzwerten kombinieren. $SEC_COMMIT $SEC_IMAGE $SEC_LARGE_PAGES $SEC_NOCACHE $SEC_RESERVE $SEC_WRITECOMBINE |
| $tSecurity | [optional] Die $tagSECURITY_ATTRIBUTES Struktur welche angibt ob das zurückgegebene Handle von einem Childprozess geerbt werden kann. Wenn dieser Parameter 0 ist (Standard), dann kann das Handle nicht geerbt werden und das File-Mapping-Objekt erhält einen Standardsicherheitsdeskriptor. |
| Erfolg: | Das Handle zu dem neu erstellten File-Mapping-Objekt. Wenn das Objekt vor diesem Funktionsaufruf existiert, so gibt die Funktion das Handle zum bereits existierenden Objekt (mit ihrer aktuellen Datei und nicht die angegebene) und setzt @extended zu $ERROR_ALREADY_EXISTS (183). |
| Fehler: | 0, @extended wird auf _WinAPI_GetLastError() gesetzt. |
Nachdem ein File-Mapping-Objekt erstellt wurde, darf die Größe der Datei nicht die Größe des File-Mapping-Objektes überschreiten; sollte das passieren, so stehen nicht alle Dateiinhalte zum Teilen zur Verfügung.
Mehrere Prozesse können die Sicht der selben Datei teilen indem sie entweder ein einzelnes File-Mapping-Objekt verwenden oder separate File-Mapping-Objekte verwenden welche auf die selbe Datei zeigen. Ein einzelnes File-Mapping-Objekt kann durch mehrere Prozesse, mittels Vererbung beim Prozesserstellen, dem Duplizieren eines Handles, oder dem Öffnen eines File-Mapping-Objektes mittels Dateiname, geteilt werden.
Ein File-Mapping-Objekt mappt tatsächlich nicht die Sicht in einen Prozessadressraum. Die _WinAPI_MapViewOfFile() Funktionen mappen eine Sicht einer Datei in den Prozessadressraum.
Gemappte Sichten eines File-Mapping-Objektes behalten interne Referenzen zum Objekt und ein File-Mapping-Objekt kann nicht geschlossen werden bis diese Referenzen alle freigegeben wurden.
Deshalb muss die Anwendung, um ein File-Mapping-Objekt komplett zu schließen, alle gemappten Sichten mit der _WinAPI_UnmapViewOfFile() Funktion unmappen und das Handles des File-Mapping-Objektes mittels _WinAPI_CloseHandle() schließen.
Die Reihenfolge, in welcher diese Funktionen aufgerufen werden, spielt keine Rolle.
_WinAPI_CloseHandle, _WinAPI_UnmapViewOfFile
Suche nach CreateFileMapping in der MSDN Bibliothek.
#NoTrayIcon
#include <MsgBoxConstants.au3>
#include <StringConstants.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