• Keine Ergebnisse gefunden

HKDQGOXQJYRQ'DWHLHQ

Im Dokument Windows-Programmierung mit C++ (Seite 135-147)

9.1 Allgemeines

9.1.1 Dateisysteme

Es gibt mehrere Dateisysteme, die von verschiedenen Windowsversi-onen unterstützt werden. So unterstützt Windows NT das NTFS und Windows 95/98 das „Protected FAT File System“. Diese Dateisys-teme sind Definitionen, wie Dateien und Verzeichnisse auf der Fest-platte abgespeichert werden. Dazu gehören z. B. Informationen, wie lang Dateinamen sein, welche Zeichen darin vorkommen dürfen oder welche Sicherheitsattribute die Dateien tragen.

9.1.2 Funktionen

Windows stellt für diese Dateisysteme Funktionen bereit. Diese Funktionen laufen unter allen Dateisystemen. Deshalb kann der Code, der für ein Programm für Windows 95 geschrieben wurde, ohne Probleme auf Windows NT ausgeführt werden. Auch die Dateiverwal-tung funktioniert dort entsprechend.

9.2 Die Anwendung

9.2.1 Der Quelltext

Die folgende Anwendung ist ein Editor, der nur auf den Bildschirm be-zogen ist. Er besitzt ein Menü. Mit dem Menüpunkt „Beenden“ wird der Editor beendet. Die Funktion Neu setzt den Zeichenpuffer auf 0 Zeichen. Es kann also neuer Text eingegeben werden. Die Funktion

„Speichern“, speichert den Text aus dem Edit-Feld, welches den Hauptbestandteil des Editors ausmacht, in der Datei c:\text.txt. Mit der Funktion „Öffnen“ wird die vorhandene Datei c:\text.txt geöff-net. Damit wären die wichtigsten Dateifunktionen in das Programm eingebunden.

Nitty Gritty • Start up!

Bild 9.1: Anwendung nach dem Start

Bild 9.2: Anwendung mit einem Textbeispiel

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

Nitty Gritty • Start up!

HINSTANCE hInstGlobal;

HWND hEdit;

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {

hInstGlobal = hInstance;

WNDCLASS WndClass;

WndClass.style = 0;

WndClass.cbClsExtra = 0;

WndClass.cbWndExtra = 0;

WndClass.lpfnWndProc = WndProc;

WndClass.hInstance = hInstance;

WndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);

WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);

WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

WndClass.lpszMenuName = 0;

WndClass.lpszClassName = "WinProg";

RegisterClass(&WndClass);

HWND hWindow;

hWindow = CreateWindow("WinProg","Bildschirm Editor", WS_OVERLAPPEDWINDOW,

0,0,600,400,NULL,NULL, hInstance, NULL);

ShowWindow (hWindow, nCmdShow);

UpdateWindow (hWindow);

MSG Message;

while (GetMessage(&Message, NULL, 0, 0))

Nitty Gritty • Start up!

{ TranslateMessage (&Message);

DispatchMessage(&Message);

}

return (Message.wParam);

}

LRESULT CALLBACK WndProc (HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam) {

switch(uiMessage) {

case WM_CREATE:

HMENU hMenu;

hMenu = CreateMenu ();

MENUITEMINFO mii;

mii.cbSize = sizeof(MENUITEMINFO);

mii.fMask = MIIM_TYPE | MIIM_ID;

mii.fType = MFT_STRING;

char *string;

string = new char[40];

mii.dwTypeData = string;

mii.cch = lstrlen (string);

HMENU hMenu2;

hMenu2 = CreatePopupMenu ();

lstrcpy (string, "&Neu");

mii.dwTypeData = string;

mii.cch = lstrlen (string);

mii.wID = 1;

InsertMenuItem (hMenu2, 1, TRUE, &mii);

lstrcpy (string, "&Oeffnen c:\\text.txt");

mii.dwTypeData = string;

mii.cch = lstrlen (string);

mii.wID = 2;

Nitty Gritty • Start up!

InsertMenuItem (hMenu2, 2, TRUE, &mii);

lstrcpy (string, "&Speicher c:\\text.txt");

mii.dwTypeData = string;

mii.cch = lstrlen (string);

mii.wID = 3;

InsertMenuItem (hMenu2, 3, TRUE, &mii);

mii.fMask = MIIM_TYPE;

mii.fType = MFT_SEPARATOR;

InsertMenuItem (hMenu2, 4, TRUE, &mii);

mii.fMask = MIIM_TYPE | MIIM_ID;

mii.fType = MFT_STRING;

lstrcpy (string, "&Beenden");

mii.dwTypeData = string;

mii.cch = lstrlen (string);

mii.wID = 4;

InsertMenuItem (hMenu2, 5, TRUE, &mii);

lstrcpy (string, "&Datei");

mii.dwTypeData = string;

mii.cch = lstrlen (string);

mii.fMask = MIIM_TYPE | MIIM_SUBMENU;

mii.hSubMenu = hMenu2;

InsertMenuItem (hMenu, 1, FALSE, &mii);

SetMenu (hWnd, hMenu);

RECT rect;

GetClientRect (hWnd, &rect);

hEdit = CreateWindow("EDIT","",

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 0,0,rect.right,rect.bottom, hWnd,(HMENU) 1,

hInstGlobal, NULL);

return 0;

Nitty Gritty • Start up!

Nitty Gritty • Start up!

Da die Anwendung zum größten Teil bekannte Elemente enthält, kon-zentrieren wir uns auf die Dateifunktionen.

Eine Datei öffnen oder neu erstellen

Wenn man die Funktion DATEI/ÖFFNEN im Menü anklickt, wird ent-weder eine bestehende Datei geöffnet oder eine neue Datei ange-legt. Die Daten dieser Datei werden in einen Buffer eingelesen. Zu diesem Zweck wird ein Dateiobjekt erstellt, das dann wieder ge-schlossen werden muss, damit auch andere Programme auf diese

Nitty Gritty • Start up!

Datei zugreifen können. Zum Schluss werden die eingelesenen Daten an das Edit-Feld übergeben.

case 2:

HANDLE hFile;

hFile = CreateFile ("c:\\text.txt", GENERIC_READ,0, NULL,OPEN_EXISTING, NULL,NULL);

DWORD Size;

Size = GetFileSize (hFile, NULL);

char *FileText;

SetWindowText (hEdit, FileText);

return 0;

CreateFile

Die Funktion CreateFile erstellt ein Dateiobjekt und liefert einen Handle auf dieses Dateiobjekt zurück.

Die Funktion wird im Quelltext einerseits zum Öffnen oder Neuerstel-len einer Datei verwendet, andererseits wird sie aber auch dazu ge-nutzt, eine Datei zum Speichern zu erstellen.

hFile = CreateFile ("c:\\text.txt", GENERIC_READ,0, NULL,OPEN_EXISTING, NULL,NULL);

Nitty Gritty • Start up!

hFile = CreateFile ("c:\\text.txt", GENERIC_WRITE,0,NULL, CREATE_ALWAYS, NULL,NULL);

lpFileName ist ein Zeiger auf einen Array des Typs char. Hier müs-sen Name und Pfad der Datei angegeben werden.

dwDesiredAccess bestimmt die Art des Zugriffs auf das jeweilige Objekt. Zwei Arten werden bei einem Dateizugriff benötigt:

GENERIC_READ bestimmt die Datei für Lesezugriff.

GENERIC_WRITE bestimmt die Datei für Schreibzugriff.

DwSharedMode bestimmt, ob man auf das Objekt gleichzeitig mehrmals zugreifen kann. Dieser Wert wird auf 0 gesetzt, damit dies nicht möglich ist.

LpSecurityAttributes ist ein Zeiger auf eine Struktur SECURITY_ATTRIBUTES. Diese Struktur enthält Angaben über die Vererbung dieses Objekts und über seine Zugriffsrechte unter Windows NT. Dieser Wert wird auf NULL gesetzt. Das bedeutet, dass das Objekt nicht vererbt werden kann.

DwCreationDisposition gibt weitere Informationen für die Ak-tion, die mit dwDesiredAccess gesetzt wurde.

OPEN_EXISTING bedeutet, dass nur existierende Dateien für ei-nen Zugriff geöffnet werden sollen.

CREATE_ALWAYS bestimmt, dass auch eine neue Datei erstellt wird, wenn die Datei schon vorhanden ist.

DwFlagsAndAttributes belegt die Datei Attribute für Benutzerzu-griff und Server/Client ZuBenutzerzu-griff. Dieser Wert wird auf NULL gesetzt.

HTemplateFile wird auf NULL gesetzt. Auf die Bedeutung dieses Parameters gehen wir hier nicht näher ein.

ReadFile

Die Funktion ReadFile liest Daten aus einer Datei in einen Buffer ein.

BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer,

DWORD nNumberOfBytesToRead,

Nitty Gritty • Start up!

LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);

Im Quelltext wird diese Funktion einmal benutzt, um eine Datei zu le-sen.

ReadFile (hFile,FileText,Size+1, &Readd,NULL);

HFile ist der Handle auf das Dateiobjekt.

LpBuffer ist ein Zeiger auf einen Buffer.

NNumberOfBytesToRead ist die Anzahl der Bytes, die aus der Datei gelesen werden sollen.

LpNumerOfBytesRead ist die Anzahl der gelesen Bytes. Da dieser Wert zurück gegeben wird, muss er als Zeiger angegeben werden.

LpOverlapped ist dafür zuständig, dass eine Datei ab einem be-stimmten Offset gelesen wird. Dieser Wert wird auf NULL gesetzt.

So wird die Datei immer wieder vom Anfang gelesen.

WriteFile

Die Funktion WriteFile schreibt Daten aus einem Buffer in ein Datei-objekt.

BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);

Die Funktion ist einmal im Quelltext vorhanden. Jede Funktion mit Da-teizugriff ändert die Daten meistens direkt in der Datei.

WriteFile (hFile,FileText,

GetWindowTextLength(hEdit)+1, &Readd,NULL);

HFile ist der Handle auf das Dateiobjekt, in das die Daten aus dem Buffer übertragen werden sollen.

LpBuffer ist ein Zeiger auf den Buffer.

NNumberOfBytesToWrite ist die Anzahl der Bytes, die aus dem Buffer in das Dateiobjekt übertragen werden sollen.

Nitty Gritty • Start up!

LpNumberOfBytesWritten gibt an, wie viele Bytes wirklich in das Dateiobjekt geschrieben wurden.

LpOverlapped gibt den Offset an. Dieser Wert hat die gleiche Be-deutung wie der von ReadFile.

CloseHandle

Mit der Funktion CloseHandle wird ein Dateiobjekt entfernt.

BOOL CloseHandle( HANDLE hObject);

Die Funktion wird einmal zum Schließen des Dateiobjekts für Lesezu-griffe und einmal für SchreibzuLesezu-griffe aufgerufen.

CloseHandle (hFile);

HFile ist der Handle auf das Dateiobjekt, das geschlossen werden soll.

Im Dokument Windows-Programmierung mit C++ (Seite 135-147)