Code-Beispiel
FileMapping
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
LGPL | Volta | 29.05.2016 |
cfm_sender.bas
#include "windows.bi"
Type nach
s As Integer
e As Integer
n As Zstring *1000
End Type
Dim Nachricht As nach
Dim As Integer lennach=Sizeof(Nachricht)
Dim As String ausgabe, t
Dim As HANDLE filemap
Dim As Any Ptr pmem
Dim As Integer Erg
Dim As HWND Konshndl
Dim As Zstring *MAX_PATH Titel
Function Is_Konsole (Byval Titel As Zstring Ptr) As HWND
'der Titel der Konsole wird abgefragt.
'Die Funktion gibt die Länge des Titelstrings zurück. Ist die Länge = 0
'wurde kein Konsolenfenster erstellt (z.B. mit -s gui kompiliert).
If GetConsoleTitle (Titel, MAX_PATH) = 0 Then
MessageBox Null,"keine Konsole " + chr(10,10) + _
"Bitte ohne -s gui kompilieren!", "Achtung:", MB_ICONERROR
End 'sonst hängt sich das Programm auf
End If
Function = findwindow(0,*Titel)'Wie jedes Window hat auch die Konsole ein Handle
End Function
Konshndl = Is_Konsole(@Titel)
'FileMap-Objekt erzeugen
'declare function CreateFileMapping alias "CreateFileMappingA"
'(byval as HANDLE, 'Dateihandel ->da Pagefile: &Hffffffff
' byval as LPSECURITY_ATTRIBUTES, 'Optionale Sicherheitsattribute hier: Null
' byval as DWORD, 'Zugriffsart: PAGE_READWRITE
' byval as DWORD, 'Größe High: höherwertige 32 bits
' byval as DWORD, 'Größe Low : niederwertige 32 bits
' byval as LPCSTR) 'Name: @"irgendeiner"
' as HANDLE
filemap=CreateFileMapping (cast(HANDLE,-1), Null, PAGE_READWRITE,0,lennach,@"Volta_Play")
If filemap = Null Then
MessageBox Konshndl,"FileMap-Objekt kann nicht erzeugt werden",_
"Achtung: "+Titel,MB_ICONERROR
End
End If
'View des Objektes erzeugen
'Handle des Pagefile: filemap
'gewünschte Zugriffsart (Lesen, Schreiben etc.): FILE_MAP_WRITE
'höher- und niederwertiges DoubleWord des Offset im Pagefile: 0,0,
'Größe des abzubildenden Bereichs:
pmem = MapViewOfFile(filemap, FILE_MAP_ALL_ACCESS, 0,0,lennach)
If pmem = 0 Then
MessageBox Konshndl,"View des Objektes kann nicht erzeugt werden",_
"Achtung:"+Titel,MB_ICONERROR
CloseHandle(filemap)
End
End If
'Hauptschleife
Shell "start cfm_empf"
Sleep 300,1
SetConsoleTitle Titel
t= Time
Do
If t <> Time Then
t= Time
Locate 1,1 :Print t
Nachricht.n = "Gesendet von "+Titel+" es ist " + t +" Uhr."
' Daten schreiben
CopyMemory(pmem, @Nachricht, lennach)
End If
Sleep 200,1
Loop While Inkey=""
Nachricht.n = "bye bye .."'+String(30," ")
CopyMemory(pmem, @Nachricht, lennach)
Locate 3,1
Input "Deine Nachricht an den Empfaenger: ", Nachricht.n
'ausgabe = Left(ausgabe+String(30," "),250)
CopyMemory(pmem, @Nachricht, lennach)
Sleep
Nachricht.n = Chr(27,0)
CopyMemory(pmem, @Nachricht, lennach)
Sleep 1000,1
' View und FileMap-Objekt freigeben
UnmapViewOfFile(pmem)
CloseHandle(filemap)
End
cfm_empf.bas
#include "windows.bi"
Type nach
e As Integer
s As Integer
n As Zstring *1000
End Type
Dim Nachricht As nach
Dim lennach As Integer
lennach =Sizeof(Nachricht)
Dim As HANDLE filemap
Dim As Any Ptr pmem
Dim As Integer Erg
Dim As HWND Konhndl
Dim As Zstring *MAX_PATH Titel = ""
'Hier wird der Titel der Konsole abgefragt.
Erg = GetConsoleTitle (@Titel, MAX_PATH)
'Die Funktion gibt die Länge des Titelstrings zurück. Ist die Länge = 0
'wurde kein Konsolenfenster erstellt (z.B. mit -s gui kompiliert).
If Erg = 0 Then
MessageBox 0,"keine Konsole (Bitte ohne -s gui kompilieren)",_
"Achtung:",MB_ICONERROR
End 'sonst hängt sich das Programm auf
End If
'Wie jedes Window hat auch die Konsole ein Handle
Konhndl = findwindow(0,Titel)
'FileMap-Objekt erzeugen (PAGE_READONLY)
filemap=CreateFileMapping (Cast(HANDLE,-1), Null, PAGE_READWRITE,0,lennach,@"Volta_Play")
If filemap = 0 Then
MessageBox Konhndl,"FileMap-Objekt kann nicht erzeugt werden",_
"Achtung: "+Titel,MB_ICONERROR
End
End If
'View des Objektes erzeugen (nur lesen)
pmem = MapViewOfFile(filemap, FILE_MAP_ALL_ACCESS, 0,0,lennach)
If pmem = 0 Then
MessageBox Konhndl,"View des Objektes kann nicht erzeugt werden",_
"Achtung:"+Titel,MB_ICONERROR
CloseHandle(filemap)
End
End If
'Hauptschleife
Do
' Daten lesen
CopyMemory(@Nachricht,pmem, lennach)
Cls'Locate 1,1
Print Nachricht.n
Sleep 300,1
Loop While Left(Nachricht.n,1)<>Chr(27)
' View und FileMap-Objekt freigeben
UnmapViewOfFile(pmem)
CloseHandle(filemap)
End
Mit den neuen FB-Versionen geht es auch einfacher, ohne viele Fehlerabfragen :-)
'FB 1.04 x64 ,name: fm_sender.bas
#Include "windows.bi"
ScreenRes 320,200,32
Width 320\8,200\16
ScreenControl 100, 50, 40 'SET_WINDOW_POS
Dim As HANDLE hMap
Dim As LongInt Ptr lpMap
hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1000, "volta_FileMapping")
If hMap Then
lpMap = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0)
Shell "start fm_empf"
Do
*lpMap = CVLongInt (Time) '8 Byte passt für den TIME-String
Print Time
Sleep 900
Loop While Inkey = ""
UnmapViewOfFile(lpMap)
EndIf
CloseHandle(hMap)
'FB 1.04 x64 ,name: fm_empf.bas
#Include "windows.bi"
ScreenRes 320,200,32
Width 320\8,200\16
Dim As HANDLE hMap
Dim As LongInt Ptr lpMap
hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "volta_FileMapping")
If hMap Then
lpMap = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0)
Do
Print MkLongint(*lpMap)
Sleep 900
Loop While Inkey = ""
UnmapViewOfFile(lpMap)
EndIf
CloseHandle(hMap)
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|