Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Dateien und Laufwerke

FileMapping

Lizenz:Erster Autor:Letzte Bearbeitung:
LGPLRedakteurVolta 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
  • Das Code-Beispiel wurde am 11.04.2008 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 29.05.2016 von RedakteurVolta gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen