| |
|
|
| CreateFileMapping erzeugt ein Dateiabbildungsobjekt und liefert dessen Handle zurück. Filemapping ist eine einfache Art komplette (auch sehr große) Dateien im Speicher zu behalten und von mehreren Prozessen aus darauf zugreifen zu können. So können sowohl recht effektive Pipes erzeugt als auch sehr schnelle Bearbeitungszeiten erreicht werden.
Deklaration:
DEF @CreateFileMapping(6) !kernel32,CreateFileMappingA
Parameter:
1.Parameter: Handle einer geöffneten Datei oder $FFFFFFFF als Handle auf einen virtuellen Speicherbereich. 2.Parameter: Security-Attributes Struktur oder für das erzeugte Objekt. Kann auch 0 sein. 3.Parameter: Flag, der den erlaubten Zugriff regelt. Für den gewünschten Zugriff muß das Filehandle ebenfalls die passenden Accessrechte haben. Flags können mit | addiert werden.=> -$2 = Nur lesen. -$4 = Schreiben und lesen. -$8 = Lesen und schreiben, aber nicht auf die Platte. Unter NT-basierten Systemen schreiben nur im aktuellen Prozess. Dazu kann einer der folgenden Speicher-Flags mit | addiert werden: => -$8000000 = Alloziert physikalischen Speicher im Speicher oder in der Paging-Datei des Systems auf der Plattefür alle Seiten in einem Abschnitt (Standard) -$1000000 = Die durch das Handle in Parameter 1 angegebene Datei ist eine EXE. Parameter 2 und die Zugriffsrechte aus Parameter 3 werden von der Datei genommen. -$4000000 = Reserviert alle Seiten eines Abschnitts, ohne physikalischen Speicher zu allozieren. Dieser reservierte Speicherbereich kann nicht vn anderen Allozierungsoparationen werwendet werden, bis er freigegeben wird. Reservierte Seiten können in folgenden Aufrufen der Funktion VirtualAlloc() weitergegeben werden. Dieser Flag ist nur gültig, wenn für Parameter 1 $FFFFFFFF definiert wurde! Zu $8000000 oder $4000000 kann dann noch folgender Flag mit | addiert werden: => -$10000000 = Alle Seiten eines Abschnitts werden als „nicht cachefähig“ gekennzeichnet. 4.Parameter: Die oberen 32 Bits der Größe des gemappten Bereichs (für >=4GB). Kann in der Regel 0 bleiben. 5.Parameter: Die unteren 32 Bits der Größe des gemappten Bereichs. 6.Parameter: Adresse eines Strings oder Bereichsvariable mit einem String, der einen beliebigen Namen für das Mapping Objekt enthält.
Rückgabewert:
0 bei Misserfolg, ansonsten das Handle auf den Speicherbereich.
Beispiel: KompilierenMarkierenSeparierenDef @MapViewOfFile(5) !kernel32,MapViewOfFile
DEf @UnmapViewOfFile(1) !kernel32,UnmapViewOfFile
DEF @CopyMemory(3) !kernel32,RtlMoveMemory
WINDOWSTYLE 31+512
Windowtitle Hier wird die Variable erzeugt
WINDOW 0,0-300,400
Declare Variable&,Tick&,Name$,Ausgelesen#
Declare Speicherhandle&,Speicheraddr&
Let Name$=AH-Variable
LET Speicherhandle&=@CreateFileMapping($FFFFFFFF,0,4,0,4,@addr(Name$))
LET Speicheraddr&=@MapViewOfFile(Speicherhandle&,2,0,0,0)
Drawtext 0,50,Handle des Speicherbereichs:+@STR$(Speicherhandle&)
LET TICK&=&GETTICKCOUNT
Whilenot %MENUITEM=-2
IF &GETTICKCOUNT-Tick&>10000
Let Variable&=@RND(1000)
@CopyMemory(Speicheraddr&,@addr(Variable&),4)
LET TICK&=&GETTICKCOUNT
endif
DIM Ausgelesen#,256
@CopyMemory(Ausgelesen#,Speicheraddr&,4)
Drawtext 0,80,Variale=+@STR$(@LONG(Ausgelesen#,0))+
Dispose Ausgelesen#
Sleep 10
WEND
@UnmapViewOfFile(Speicheraddr&)
@CloseHandle(Speicherhandle&)
Beep 1
|
|
|
| |
|
|