Vorbemerkung: Die Dateimacros sind in einer ASCII- und in einer UNICODE- Version verfügbar. Die Namen der UNICODE- Version unterscheiden sich von den Namen der ASCII-Version durch ein nachgestelltes „W”.
Beispiele dazu:
fcreate Erzeugt eine neue Datei und meldet dessen Zugriffsnummer (Handle) zurück. Damit ist die neu angelegte Datei geöffnet.
fcreateW Die UNICODE- Version von fcreate.
File IO Macros aus High Level Macro Help / Macro Categories / File IO Macros |
Load and Save Complete File (Laden und Speichern der vollständigen Datei)Die Dateilängen müssen in Bytes angegeben werden. Jedes UNICODE-Zeichen belegt zwei Bytes, jedes ASCII-Zeichen belegt ein Byte. InputFile liest die gesamte Datei in einen Speicherbereich (memory buffer).
Je nachdem, ob die ASCII- oder UNICODE-Version spezifiziert ist, muss auch der Dateiname in ASCII oder UNICODE angegeben werden. Für die Direktangabe (Literal) in ASCII ist das Makro „ascii()” zuständig. Für die Direktangabe in UNICODE ist „uni$()” oder „uc$()” zuständig. Wenn eine Stringadresse statt einer Direktangabe erfolgt, muss auch der String passend in ASCII oder UNICODE codiert sein. Es gibt insgesamt sechs verschiedene File IO Macros: |
| |||||||||||||||||
InputFile - liest die gesamte Datei in einen Speicherbereich (memory buffer)mov hMem, InputFile(dateiname)Parameter: Hinweis: Vor Aufruf von InputFile soll überprüft werden, ob die Datei vorhanden ist. Nach Bearbeitung der Datei soll der belegte Speicherpuffer durch Anwendung des Makros free freigegeben werden. Beispiel: mov hMem, InputFile("privatdatei.txt") mov flen, ecx ; hier Programmcode free hMemApplikationsbeispiel in HD.exe - hexadezimale Dateianzeige | |||||||||||||||||
OutputFile - schreibt einen Speicherbereich als gesamte Datei auf einen Datenträgermov rval, OutputFile(dateiname,lpmem,flen)Parameter: Hinweis: Das Makro überschreibt eine bestehende Datei gleichen Namens. Da der Rückgabewert im EAX-Register steht, kann er im Quellprogramm so geschrieben werden, als ob es das EAX-Register wäre. Beispiel dazu: test OutputFile("neuedatei.txt",pbuffer,flen), eax jnz @F ; hier sollte auf den Fehler eingegangen werden @@: | |||||||||||||||||
Low Level File Operations aus High Level Macro Help / Macro Categories / File IO Macros | |||||||||||||||||
Diese Makros sind in einer ASCII- und in einer UNICODE- Version verfügbar
In den folgenden Kurzbeschreibungen bedeutet
| |||||||||||||||||
fcreate - Erzeugt eine neue Datei und meldet ihre Zugriffsnummer (Handle) zurückmov hFile, fcreate(filename)Parameter:
Hinweis: Durch die Erzeugung der Datei wird sie im Update-Modus eröffnet. Beispiel: mov hFile, fcreate("mynewfile.ext")
Nachfolgend die Makro-Definition aus masm32/macros.asm: ; --------------------------------------------------------------------- ; create a new file with read / write access and return the file handle ; --------------------------------------------------------------------- fcreate MACRO filename invoke CreateFileA,reparg(filename),GENERIC_READ or GENERIC_WRITE, NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL EXITM <eax> ;; return file handle ENDM | |||||||||||||||||
fdelete - löscht eine Dateicmp fdelete(filename), 0Parameter: Dies Makro ruft die Windows API DeleteFile() auf. Beispiel: cmp fdelete("tempfile.ext"), 0
jne @F
print "Schade, das hat nicht geklappt",13,10
@@:
| |||||||||||||||||
fopen - öffnet eine bestehende Datei und meldet ihre Zugriffsnummer (Handle) zurückmov hFile, fopen(filename)Parameter:
Beispiel: mov hFile, fopen("liesmich.txt")
Nachfolgend die Makro-Definition aus masm32/macros.asm: ; ------------------------------------------------------------------------- ; open an existing file with read / write access and return the file handle ; ------------------------------------------------------------------------- fopen MACRO filename invoke CreateFileA,reparg(filename),GENERIC_READ or GENERIC_WRITE, NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL EXITM <eax> ;; return file handle ENDM | |||||||||||||||||
fclose - schließt eine offene Dateifclose hFileParameter:
Beispiel: fclose hFile
| |||||||||||||||||
fread - liest Daten von einer geöffneten Dateimov bDaten, fread(hFile,lpMemory,bcnt)Parameter:
Beispiel: mov bDaten, fread(hFile,lpMemory,bytecount)
| |||||||||||||||||
fwrite - schreibt Daten in eine geöffnete Dateimov bwritten, fwrite(hFile,lpMemory,bcnt)Parameter
Beispiel: mov bwritten, fwrite(hFile,lpmemory,bytecount)
| |||||||||||||||||
fprint - schreibt eine Zeile in eine geöffnete Dateifprint hFile,lptextParameter: Dies Makro ergänzt einen Zeilenvorschub (13,10) am Zeilende. Es ist dazu bestimmt, Textzeilen sequentiell auszugeben. Beispiel: fprint hFile,"Dies ist eine Zeile voller Text"
| |||||||||||||||||
fprintc - Schreibt C-formatierten Text in eine geöffnete Dateifprintc hFile,"Hi Guys\n"Parameter: | |||||||||||||||||
fseek - positioniert innerhalb der geöffneten Datei auf eine bestimmte Positionmov cloc, fseek(hFile,distance,location)Parameter: Beispiel setzt die Position auf 100 ab Dateianfang: mov cloc, fseek(hFile,100,FILE_BEGIN)
| |||||||||||||||||
fseteof - setzt das Dateiende an die aktuelle Position der geöffneten Dateifseteof hFileParameter: fseteof wird normalerweie zum Abschneiden / Verkürzen der Datei verwendet Beispiel: fseteof hFile | |||||||||||||||||
fsize - ermittelt die Größe einer geöffneten Datei in Bytesmov flen, fsize(hFile)Parameter: |
File Functions aus der MASM32 Library Reference |
Die Datei \masm32\lib\masm32.lib ist eine Sammlung von zusätzlichen Prozeduren. Um diese Prozeduren nutzen zu können,
müssen diese zwei Zeilen im Assemblerprogramm vorhanden sein:
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib
Die Prozeduren sind:
|
exist - ist die Datei vorhanden?exist dateinameParameter: dateiname ist der Dateiname als Zeiger auf einen ASCII-String mit 0 als Endemarkierung oder eine in doppelte Gänsefüßchen eingekleidete Zeichenkette Rückgabewert: 0 wenn die Datei nicht exstiert, andernfalls 1 Beispiel: .if rv(exist,ADDR fname) == TRUE ;Datei vorhanden? ; test if file ; Hier Bearbeitung der Datei .else print "Schade, diese Datei wurde nicht gefunden",13,10 .endifApplikationsbeispiel in \masm32\examples\exampl07\fileio\ppfileio.asm Übungsbeispiel in Testerei mit input, StdIn, fwrite, fprint, exist, fcreate, fclose |
filesize - ermittle die DateigrößeParameter:dateiname ist der Dateiname als Zeiger auf einen ASCII-String mit 0 als Endemarkierung oder eine in doppelte Gänsefüßchen eingekleidete Zeichenkette Rückgabewert -1 wenn die Datei nicht exstiert, andernfalls steht in EAX die Dateigröße in Bytes. Hinweis: Die Dateigröße wird ermittelt, ohne dass die Datei geöffnet wird. Zwei Beispiele: mov bytecount, rv(filesize,chr$("\masm32\include\windows.inc")) mov bytecount, rv(filesize,ADDR dateiname) Applikationsbeispiel in fn und rv unterstützen invoke |
read_disk_file - lese Datei in Speicherpufferread_disk_file proc dateiname,lpMem,lpLenParameter: 1. dateiname ist der Dateiname als Zeiger auf einen ASCII-String mit 0 als Endemarkierung oder eine in doppelte Gänsefüßchen eingekleidete Zeichenkette 2. lpMem Die Adresse einer DWORD-Variablen mit dem Startadresse des Speicherpuffer 3. lpLen Die Adresse einer DWORD-Variablen mit der Anzahl der in den Speicherpuffer zu schreibenden Bytes Rückgabewert: 0 wenn der Schreibzugriff nicht erfolgreich war, andernfalls nicht 0 Hinweis: Wenn der Inhalt des Speicherpuffers nicht mehr benötigt wird, sollte lpMem mit GlobalFree() freigegeben werden. |
write_disk_file - schreibe Datei vom Speicherpufferwrite_disk_file proc dateiname,lpData,flParameter: 1. dateiname ist der Dateiname als Zeiger auf einen ASCII-String mit 0 als Endemarkierung oder eine in doppelte Gänsefüßchen eingekleidete Zeichenkette 2. lpData Die Adresse einer DWORD-Variablen mit dem Startadresse des Speicherpuffers 3. fl ist eine DWORD-Variable mit der Anzahl der in den Speicherpuffer zu schreibenden Bytes Rückgabewert: Anzahl der in die Datei geschriebenen Bytes; 0 falls ein Fehler auftrat Hinweis: Die Prozedur ist dazu bestimmt, bei jedem Aufruf eine komplette Datei zu schreiben. Eine vorhandene Datei gleichen Namens wird dabei überschrieben. |
LoadList - lade Dateinamen in eine ListboxLoadList hWin,pattern:DWORD Lädt Dateinamen des aktuellen Verzeichnisses in eine Listbox.Parameter: 1. hWin ist das „handle” des Eltern-Fensters (parent window) 2. pattern lpPattern ist die Adresse eines ASCII-Strings mit 0 als Endemarkierung. Er enthält die Auswahlmaske mit der die zu benutzenden Dateien spezifiziert werden. Rückgabewert: Es gibt keinen Rückgabewert Das aktuelle Verzeichnis kann mit dem API-Funktionsaufruf SetCurrentDirectory() gesetzt werden. |
File Dialogs für die grafische Oberfläche (GUI) unter Windows |
OpenFileDlg - zeige Dialog zum Dateiöffnen und melde die ausgewählte Datei zurückmov fname, OpenFileDlg(hWin,hInstance,lpTitle,lpPattern)Parameter: 1. hWin ist das „handle” des Eltern-Fensters (parent window) 2. hInstance ist das „Instance handle” der Applikation 3. lpTitle ist die Adresse eines ASCII-Strings mit 0 als Endemarkierung 4. lpPattern ist die Adresse eines ASCII-Strings mit 0 als Endemarkierung. Er enthält die Auswahlmaske mit der die zu benutzenden Dateien spezifiziert werden. Rückgabewert: Die Adresse eines 260 Bytes langen Puffers mit den ausgewählten Dateinamen. Falls das erste Byte im Puffer eine 0 ist, dann wurde nichts ausgewählt. Hinweis: Die Auswahlmaske erwartet Namen und Muster durch 0 getrennt. Zwei Nullen hintereinander geben das Ende der Maske an. Beispiele zum Hinweis: .data pattern db "Text Files",0,"*txt",0,"Ini Files",0,"*ini",0,0 .code Außerdem kann genutzt werden: sas pattern, "All files",0,"*.*",0 Beispiel: mov fname, OpenFileDlg(hWnd,hInstance,"Öffne eine neue Datei",ADDR pattern) cmp BYTE PTR [eax], FALSE ; ist das erste Byte 0? (0=FALSE) jne @F ; nicht FALSE, also richtig ; hier Programmschritte zur Fehlerbehandlung @@: |
SaveFileDlg - zeige Dialog zum Dateispeichern und melde den ausgewählte Dateinamen zurückmov fname, SaveFileDlg(hWin,hInstance,lpTitle,lpPattern)Parameter: 1. hWin ist das „handle” des Eltern-Fensters (parent window) 2. hInstance ist das „Instance handle” der Applikation 3. lpTitle ist die Adresse eines ASCII-Strings mit 0 als Endemarkierung 4. lpPattern ist die Adresse eines ASCII-Strings mit 0 als Endemarkierung. Er enthält die Auswahlmaske mit der die zu benutzenden Dateien spezifiziert werden. Rückgabewert: Die Adresse eines 260 Bytes langen Puffers mit den ausgewählten Dateinamen. Falls das erste Byte im Puffer eine 0 ist, dann wurde nichts ausgewählt. Hinweis: Die Auswahlmaske erwartet Namen und Muster durch 0 getrennt. Zwei Nullen hintereinander geben das Ende der Maske an. Beispiele zum Hinweis: .data pattern db "Text Files",0,"*txt",0,"Ini Files",0,"*ini",0,0 .code Außerdem kann genutzt werden: sas pattern, "All files",0,"*.*",0 Beispiel: mov fname, SaveFileDlg(hWnd,hInstance,"Save File As ...",ADDR pattern) cmp BYTE PTR [eax], FALSE ; ist das erste Byte 0? (0=FALSE) jne @F ; nicht FALSE, also richtig ; hier Programmschritte zur Fehlerbehandlung @@: |
GetFile - Vorbereiter Dialog zur DateiauswahlDie Einrichtung eines Dialogs ist wohl eine mühsame Angelegenheit. Deshalb wurde ein Dialog vorbereitet, der die Programmierung erleichtert. Der Dialog „GetFile” dient dazu, eine Datei in einem vorgegebenen Verzeichnis auszuwählen. Es werden weder Laufwerk noch Verzeichnis angezeigt. Die angezeigten Dateinamen sind sortiert. Sie werden durch eine Auswahlmaske ausgewählt.Die Beschreibung steht in der interaktiven Hilfe unter „Pre-Built Dialogs”. GetFile proc Parent:DWORD,Instance:DWORD,Icon:DWORD,caption:DWORD,directory:DWORD,pattern:DWORD,buffer:DWORD
|