Chr. Vogt, FH München 1

Größe: px
Ab Seite anzeigen:

Download "Chr. Vogt, FH München 1"

Transkript

1 1 Was ist Systemprogrammierung? Windows-Programmierung Konsolenbasierte Programme GUI-Programme Das Win32 Application Programming Interface Win32-Plattformen Erlernen von Win Die Microsoft Development Library (MSDN) Bücher Win32 Header-Dateien Format der Win32-API-Dokumentation Fehlerbehandlung Objekte und Handles Objekte Arten von Objekten Benannte Objekte Handles Öffnen und Schließen von Handles Vererbung und Duplikation von Handles Pseudohandles Prozesse und Threads Erzeugen von Prozessen Beenden von Prozessen Weitere Funktionen für Prozesse Erzeugen von Threads Beenden von Threads Weitere Funktionen für Threads Synchronisation Warten auf Synchronisationsobjekte Critical Sections Mutexe Semaphore Events Waitable Timer Funktionen für atomare Operationen Asynchrone I/Os Anfordern asynchroner I/Os Synchronisation mit der I/O-Beendigung APCs als I/O-Beendigungsroutine I/O Completion Ports...44 Chr. Vogt, FH München 1

2 1 Was ist Systemprogrammierung? Eine häufig sehr hilfreiche erste Informationsquelle, der Duden Informatik, schweigt sich unter diesem Stichwort aus. Es gibt keine einheitliche Definition des Begriffes Systemprogrammierung. In der Windowsund Unix-Welt versteht man darunter das, was der Name nahelegt: die Programmierung unter Verwendung von Systemaufrufen, also offengelegten Schnittstellen zu Routinen des Betriebssystems. In der IBM- Mainframe-Welt (MVS, z/os) versteht man darunter eher die Systemverwaltung. Vielleicht nicht gerade das Einrichten eines Druckers, aber viele andere Aufgaben der Systemverwaltung erfordern dort eine systemnahe (Assembler-)Programmierung. Dies erklärt, warum in dieser Welt für Systemverwaltungsaufgaben der Begriff Systemprogrammierung verwendet wird. In der Windows-Welt wie auch unter den verschiedenen Unix-Derivaten stehen für die meisten Aufgaben der Systemverwaltung mächtige Dienstprogramme zur Verfügung, so dass hier für diese Aufgaben eine (systemnahe) Programmierung nicht notwendig ist. (Unter Unix heißt dieses mächtige Dienstprogramm in sehr vielen Fällen vi.) Im Wesentlichen wollen wir in dieser Vorlesung deshalb unter Systemprogrammierung (im Umfeld von Windows) die Verwendung von systemnahen Funktionen in Programmen verstehen. Daneben würde ich aber auch einige Aufgaben der Systemverwaltung unter diesen Begriff einordnen, für die keine oder nur sehr rudimentäre Dienstprogramme zur Verfügung stehen, und die Kenntnisse über Interna des Betriebssystems erfordern, z.b. den Umgang mit der Registrierungsdatenbank. Auch das Installieren, Konfigurieren und Aktualisieren des Betriebssystems und sonstiger Software, oder anspruchsvolle, fortgeschrittene Aufgaben wie das (hoffentlich selten nötige) Auswerten von Blue Screens würde ich unter den Begriff der Systemprogrammierung einordnen. Die Systembeobachtung und das Tunen des Systems sind ebenfalls Aufgaben, für die zwar Dienstprogramme zur Verfügung stehen, die aber nicht per Kochrezept, sondern nur mit einem hinreichend tiefen Verständnis der Vorgänge am System ausgeführt werden können. Meine Privat-Definition von Systemprogrammierung lautet deshalb: Alle Aufgaben der Programmierung und der Systemverwaltung (Installation, Konfiguration, Systembeobachtung und System-Tuning), die mehr oder weniger tiefe und fundierte Kenntnisse des internen Aufbaus des Betriebssystems erfordern. In diesem Sinne werden wir uns in dieser Vorlesung einige Rosinen der Systemprogrammierung näher betrachten. Auf jeden Fall werden dazu die Programmierung unter Verwendung von (System-)Routinen für den Umgang mit Prozessen und Threads sowie die verschiedenen Synchronisationsmechanismen gehören. Chr. Vogt, FH München 2

3 2 Windows-Programmierung Ein Programm, das Sie z.b. an einem Unix-System von einem Terminal aus starten, läuft an einer bestimmten Stelle los (ein C-Programm mit der Routine main()) und führt dann die im Programm stehenden Anweisungen der Reihe nach aus. Ein- und Ausgaben geschehen dann, wenn das Programm eine entsprechende Anweisung enthält und ausführt. Die Benutzerschnittstelle besteht also aus Textein- und -ausgaben zu den vom Programm vorgesehenen Zeitpunkten. Ein solches Programm wird auch als prozedural bezeichnet. Ein Programm unter Windows läuft üblicherweise ganz anders ab. Sie kennen alle das typische Aussehen eines Windows-Programms mit Fenstern, Menüs, Schaltflächen usw. Unabhängig vom momentan ausgeführten Programmcode können Sie Schaltflächen betätigen, Menüs öffnen und Menüpunkte auswählen, zu einem anderen Fenster (Programm) wechseln oder Fenster schließen usw. Das Programm muß dann geeignet auf diese asynchronen Eingaben reagieren. Man spricht in diesem Zusammenhang von ereignisorientierter Programmierung. Häufig ist ein Programm einfach in einem Wartezustand und wartet auf das nächste Ereignis. Win32 unterstützt zwei prinzipielle Arten von Programmen: Konsolenbasierte Programme (CUI = console user interface) Programme mit einer grafischen Oberfläche (GUI = graphical user interface) 2.1 Konsolenbasierte Programme Ein konsolenbasiertes Programm ähnelt einem Programm, wie Sie es z.b. auch unter Unix verwenden würden: der Programmablauf ist prozedural, Ein- und Ausgaben geschehen nur aufgrund entsprechender Anweisungen im Programm. Aber wo geschehen diese Ein- und Ausgaben? Auch ein konsolenbasiertes Programm benötigt ein Fenster, die sog. Konsole, das jedoch nur herkömmliche Textzeichen enthält (wie z.b. das MS/DOS-Fenster unter Windows). Aber auch für ein Konsolfenster sind natürlich gewisse Ereignisse möglich. Das Fenster kann z.b. verkleinert oder vergrößert oder ganz geschlossen werden. Um diese Standard-Fensterverwaltung kümmert sich das Windows-Betriebssystem und beendet z.b. beim Schließen eines Konsolfensters das entsprechende Programm (das hoffentlich darauf vorbereitet ist...). Und wer erzeugt das Konsolfenster beim Starten des Programms? Ein in der EXE-Datei gespeicherter Subsystem-Wert enthält die Information, ob es sich bei dem Programm um eine konsolenbasierte oder um eine GUI-Anwendung handelt. Im Falle einer konsolenbasierten Anwendung sorgt der Lader dafür, dass für das Programm ein Konsolfenster erzeugt wird. Eine GUI-Anwendung dagegen wird direkt geladen, da sie ja die benötigten Fenster in ihrem Programmcode selbst erzeugt. Wenn Sie beim Erzeugen eines Programms mit Visual C++ oder Borland C++ angeben, dass es sich um eine konsolenbasierte Anwendung handeln soll, wird ein Linker-Schalter gesetzt, so dass der Subsystem-Wert in der EXE-Datei auf CUI gesetzt wird. Das Programm muß dann eine main()-funktion enthalten, die von der Startup-Routine crt0 der Laufzeitbibliothek angesprungen wird. Sie können also Ihr Programm genau so schreiben, wie Sie es aus einer Nicht-Windows-Umgebung gewöhnt sind. Chr. Vogt, FH München 3

4 2.2 GUI-Programme Bei einem GUI-Programm wird von der Startup-Routine wincrt0 der Laufzeitbibliothek die Funktion WinMain aufgerufen. Der Prototyp von WinMain ist etwas komplizierter. Er soll uns hier nicht näher interessieren, da die Entwicklungsumgebungen diesen Teil des Programms automatisch erzeugen. GUI-Programme werden weiter unterteilt in die folgenden drei Arten von Anwendungen: Single Document Interface (SDI) Multiple Document Interface (MDI) Dialogbasierte Anwendungen SDI- und MDI-Anwendungen dienen wie schon der Name sagt der Bearbeitung von Dokumenten. Beispiele für SDI-Anwendungen sind die Editoren Notepad und WordPad von Windows: Sie können immer nur ein Dokument bearbeiten. Beim Öffnen eines neuen Dokuments wird das zuvor geöffnete Dokument geschlossen. Beispiele für MDI-Anwendungen sind übliche Textverarbeitungen oder Tabellenkalkulationen oder auch Paint usw. Sie können dort mehrere Dokumente öffnen, die jeweils in einem eigenen Fenster innerhalb des Anwendungsfensters dargestellt werden, und können beliebig zwischen den einzelnen Dokument-Fenstern hin- und herwechseln. Dialogbasierte Anwendungen sind Programme, deren Hauptprogrammfenster eine Dialogbox ist. In einer solchen Anwendung werden keine Dokumente bearbeitet, sondern andere Funktionen ausgeführt (z.b. Berechnungen), wobei die Steuerung der Funktionen mit Hilfe der Dialogbox, also mit Eingabefeldern, Schaltflächen, Menüs usw. geschieht. Die meisten Verwaltungsprogramme von Windows (Benutzermanager, Systemmonitor usw.) sind solche dialogbasierten Anwendungen. Die Gestaltung des Dialogfensters ist mit Hilfe der Entwicklungsumgebung sehr einfach. Es gibt einen Ressourcen-Editor, mit dem Sie das Fenster gestalten können, ohne eine einzige Zeile Code zu schreiben und somit ohne etwas über die Art der Implementierung der verschiedenen Elemente wissen zu müssen. Wie hängen aber jetzt die einzelnen Elemente des Dialogfensters mit dem Programm zusammen? Dazu gehören zwei Dinge: 1. Ein- und Ausgabefelder müssen mit Variablen des Programms verknüpft werden. 2. Für jede mögliche Aktion, z.b. das Klicken auf eine Schaltfläche, muß eine Behandlungsroutine geschrieben werden. Bei beiden Aufgaben unterstützt Sie wieder die Entwicklungsumgebung. Um vieles müssen Sie sich überhaupt nicht kümmern, z.b. um die (programmtechnische) Verknüpfung der Aktionen im Dialogfenster mit den von Ihnen geschriebenen Routinen. Chr. Vogt, FH München 4

5 3 Das Win32 Application Programming Interface Das Win32 Application Programming Interface (API) ist die wichtigste Schnittstelle zum Betriebssystem Windows. Obwohl Windows auch andere APIs unterstützt (z.b. POSIX und OS/2, allerdings nicht mehr ab Windows XP), bietet das Win32 API Zugriff auf den größten Teil der Möglichkeiten, die Windows bietet. So enthält z.b. das POSIX-Subsystem keine Funktionen für Multithreading oder asynchrone Ein-/Ausgaben. Das Win32 API besteht aus drei Hauptgruppen von Funktionen: Base System Services User Services (Windows management) Graphics device interface (GDI) Services Die Base System Services bieten Zugriff auf Funktionen des Betriebssystems, wie z.b. den Umgang mit Prozessen und Threads, die Speicherverwaltung, die Durchführung von Ein-/- Ausgaben oder das Verwenden von Sicherheitsmechanismen. Mit einigen dieser Funktionen werden wir uns in dieser Vorlesung beschäftigen. Bemerkung: Die Base System Services sind nicht die eigentlichen Systemaufrufe des Betriebssystems. Letztere wurden von Microsoft nicht offengelegt, so dass nur über die dokumentierten Subsystem-APIs, also z.b. das Win32-API, auf sie zugegriffen werden kann. Die User Services beinhalten Funktionen zur Gestaltung der Benutzerschnittstelle, also für die Verwaltung von Fenstern und von Tastatur- und Mauseingaben. Mit Hilfe der GDI Services können Applikationen grafische Ausgaben erzeugen. Keine dieser Funktionen wird in dieser Vorlesung behandelt. Die Gestaltung der Benutzerschnittstelle wird durch Compiler wie Borland C++ oder Microsoft Visual C++ stark vereinfacht, und der dafür notwendige Code größtenteils automatisch generiert. Insgesamt besteht das Win32 API aus über 1500 Funktionen! 3.1 Win32-Plattformen Das Win32 API ist die Spezifikation einer Programmierschnittstelle. Diese Schnittstelle oder Teilmengen davon sind nicht nur auf Windows NT / 2000 / XP implementiert, sondern auf insgesamt sechs Plattformen: Windows 3.1 (mit den Win32s-Bibliotheken). Bietet dieselbe Funktionalität wie Windows 3.1, aber mit der 32-bit-Programmierschnittstelle. Bietet darüber hinaus einige Erweiterungen, z.b. einen linearen 32-bit-Adreßraum sowie strukturierte Ausnahmebehandlung. Windows 95 / 98 / ME Bietet den größten Teil der Funktionalität wie unter Windows, aber z.b. keine Funktionen für Sicherheit, event logging oder asynchrone Ein-/Ausgaben. Windows NT / 2000 / XP Macintosh OpenVMS (Angebote von Bristol Technology und Mainsoft Corporation). Die Laufzeit-Bibliotheken von Wind/U von Bristol sind sogar in VMS enthalten. Unix (Angebote von Bristol Technology und Mainsoft Corporation). Chr. Vogt, FH München 5

6 3.2 Erlernen des Win32 API Die Microsoft Developer s Network Library Die Microsoft Developer s Network (MSDN) Library ist eine regelmäßige CD-ROM- Distribution, die (für teures Geld) abonniert werden kann. Wenn man nur kleine Teile daraus benötigt, findet man sie aber auch im Internet unter msdn.microsoft.com/library/. In der MSDN Library findet man die gesamte Win32-API-Dokumentation, die Win32 Knowledge Base, eine Problemdatenbank, jede Menge Beispielprogramme, viele technische Artikel. Die Fülle der Informationen in der MSDN ist erschlagend. Leider ist die Strukturierung nicht allzu übersichtlich, so dass es einige Zeit und Mühe kostet, die Informationen zu finden, die einen interessieren. Aber vorhanden sind sie höchstwahrscheinlich! Für unsere Vorlesung am interessantesten und am wichtigsten ist der Abschnitt Windows Development -> Windows Base Services. Die meisten Unterabschnitte gliedern sich wiederum in SDK Documentation und Technical Articles Bücher Außerdem gibt es natürlich diverse Bücher zum Win32-API. Ein Buch, das als Begleitung zur Vorlesung gut geeignet ist (mit seinen über 1000 Seiten aber auch noch jede Menge weitere Informationen enthält) ist: Jeffrey M. Richter: Windows Programmierung für Experten, 4. Auflage 2000, Microsoft Press Deutschland Es kann gut sein, dass eines der Beispielprogramme aus diesem Buch Ihnen in der Vorlesung bzw. im Praktikum wieder begegnet. Weitere Bücher mit derselben Zielsetzung, aber unterschiedlicher Stoffauswahl und Darstellung sind: Marshall Brain: Win32 System Services, 3 rd ed., Prentice Hall 2001 Johnson M. Hart: Win32 System Programming, 2 nd ed., Addison-Wesley 2000 Von Jeffrey M. Richter gibt es auch noch das Buch Microsoft.NET Framework Programmierung, Microsoft Press Chr. Vogt, FH München 6

7 3.2.3 Win32 Header-Dateien Die Win32-API-Header-Dateien enthalten Informationen über vorhandene Konstanten und Strukturen sowie Details der Programmierschnittstelle. Es handelt sich um viele kleine Dateien, die alle von der Datei Windows.h referenziert werden. Zum Beispiel enthält die Datei WinBase.h die Definitionen der Base System Services. Wenn Sie mit Visual Studio.NET 2003 arbeiten, finden Sie die Header-Dateien in \Vc7\PlatformSDK\include unterhalb des Wurzelverzeichnisses für Visual Studio. Da Sie in den Praktikumsaufgaben mit den Base System Services arbeiten werden, sollten Sie in Ihren Programmen immer Windows.h inkludieren. Manchmal ist es auch interessant, sich die eine oder andere Definition oder Deklaration in einer der Header-Dateien direkt anzuschauen Format der Win32-API-Dokumentation Die Dokumentation einer Win32-API-Funktion enthält Angaben über Bedeutung und Datentyp der Parameter und des Rückgabewertes der Funktion. Ein typisches Beispiel: DWORD WaitForMultipleObjects( DWORD ncount, CONST HANDLE *lphandles, BOOL bwaitall, DWORD dwmilliseconds // number of handles in the object handle array // pointer to the object-handle array // wait flag // time-out interval in milliseconds Die Angabe DWORD in der ersten Zeile ist der Datentyp des Rückgabewertes der Funktion, in diesem Falle ein double word. Außerdem enthält die erste Zeile den Namen der Funktion (fett). Die folgenden Zeilen enthalten den Datentyp (DWORD, BOOL usw.) (fett) der einzelnen Parameter, den Parameternamen (kursiv) und einen Kommentar, der den Parameter beschreibt. Der Parameter wird in der sog. ungarischen Notation geschrieben (die Bezeichnung kommt von der ungarischen Abstammung des Microsoft-Entwicklers, der diese Notation erfunden hat): datatypeparametername So ist z.b. der Parameter ncount vom Datentyp n (number lphandles ist ein longword pointer auf ein Feld von Handles. Einige gebräuchliche Datentypen sind: Zeichen c b n b oder f w l dw p fn sz lph Datentyp char oder count BYTE (unsigned char) short oder int BOOL (int) WORD (unsigned int) LONG (long) DWORD (unsigned long) pointer function mit 0 abgeschlossene Zeichenkette (string, zero terminated) long pointer auf ein Handle Chr. Vogt, FH München 7

8 Natürlich enthält die Dokumentation einer Funktion neben der oben angegebenen Kurzform auch noch ausführlichere Erläuterungen, z.b. zu der Funktionalität der Funktion, der Bedeutung von und den möglichen Angaben für die Parameter, dem Rückgabewert der Funktion, evtl. Einschränkungen (z.b. benötigten Rechten) oder Vorsichtsmaßnahmen, den Windows-Versionen, unter denen die Funktion zur Verfügung steht, den Header-Dateien und Bibliotheken, die für die Funktion benötigt werden Fehlerbehandlung Es gibt keine standardisierte Methode um festzustellen, ob die Ausführung einer Funktion einen Fehler produzierte. Einige Funktionen geben bei Erfolg eine 0 zurück, andere geben bei einem Fehler eine 0 zurück, andere erzeugen einfach einen Rückgabewert. Die meisten Funktionen geben bei einem Fehler NULL zurück und sagen, dass man GetLastError aufrufen soll, um den Grund für den Fehler herauszufinden. DWORD GetLastError(VOID) Auf den von GetLastError zurückgegebenen Fehlercode kann dann die Applikation geeignet reagieren, oder der Code kann mit FormatMessage in einen Nachrichtentext umgewandelt und z.b. ausgegeben werden. Leider gibt die Dokumentation einer Funktion jedoch nicht an, welche Fehlercodes von dieser Funktion erzeugt werden können. Ohne auf die einzelnen Parameter einzugehen hier ein Beispiel für die Verwendung von FormatMessage: FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, // System Message Table verwenden NULL, GetLastError(), 0, (LPTSTR) &lpmsgbuf, // Zeiger auf einen Puffer 200, // Größe des Puffers NULL In Visual Studio gibt es eine einfache Möglichkeit, zu einem numerischen Fehlercode eine Kurzbeschreibung zu erhalten: wählen Sie einfach im Menü Tools den Punkt Error Lookup. Die Header-Datei WinError.h enthält eine Liste von über 400 solchen Fehlercodes. Das Format eines Fehlercodes wird dort wie folgt beschrieben: Chr. Vogt, FH München 8

9 // Values are 32 bit values layed out as follows: // // // // // Sev C R Facility Code // // // where // // Sev - is the severity code // // 00 - Success // 01 - Informational // 10 - Warning // 11 - Error // // C - is the Customer code flag // // R - is a reserved bit // // Facility - is the facility code // // Code - is the facility's status code Gemäß dieser Beschreibung gibt das oberste Bit also an, ob die Funktion erfolgreich durchgeführt werden konnte (0 für Success oder Information) oder ob ein Fehler aufgetreten ist (1 für Warning oder Error). In Wirklichkeit steht in den obersten 16 Bit der Fehlercodes eine 0. (Oder liefert GetLastError nur die unteren 16 Bit?) Für jeden einzelnen Fehlercode folgt dann ein Eintrag wie z.b. der folgende: // MessageId: ERROR_INVALID_HANDLE // // MessageText: // // The handle is invalid. // #define ERROR_INVALID_HANDLE 6L In der MSDN finden Sie eine Liste der Error-Codes unter Windows Development -> Windows Base Services -> Debugging and Error Handling -> SDK Documentation -> Error Handling -> System Error Codes (wo sonst hätten Sie auch gesucht ). Chr. Vogt, FH München 9

10 4 Objekte und Handles Um die Win32 Base System Services zu verwenden, müssen Sie die Konzepte von Objekten und Handles verstehen. Gemeinsam benutzbare System-Ressourcen werden von Windows als Objekte implementiert. Um auf ein Objekt zuzugreifen, muß ein Prozess zunächst ein Handle auf dieses Objekt anfordern ( öffnen ). 4.1 Objekte Ein Objekt ist eine Datenstruktur mit bestimmten Eigenschaften, die gemeinsam benutzbare System-Ressourcen repräsentiert, wie z.b. Dateien, Prozesse oder Geräte. Es gibt zwei Hauptgründe, warum System-Ressourcen als Objekte implementiert werden: 1. Microsoft kann die Funktionalität von Windows verbessern, solange die Schnittstelle zu den Objekten unverändert bleibt. 2. Die Benutzung von Objekten ermöglicht die Nutzung der Sicherheitsmerkmale von Windows. Jedes Objekt hat eine Access Control List (ACL), die festlegt, welcher Prozess welche Aktionen mit dem Objekt ausführen darf. Ein Objekt besteht aus einem Standard-Kopf und objekttypspezifischen Attributen. Der Objekt-Kopf enthält z.b. den Namen des Objekts und einen Sicherheits-Beschreiber. Da alle Objekte die gleiche grundlegende Struktur haben, gibt es nur einen einzigen Objekt-Manager, der alle Objekte handhabt. Zu den Aufgaben des Objekt-Managers gehören Das Erzeugen von Objekten. Die Überprüfung, ob ein Prozess das Recht hat, ein Objekt zu benutzen. Das Erzeugen (Öffnen) und Schließen von Handles zu einem Objekt (s.u.). Das Verwalten von Quoten für Ressourcen. Das Win32-API enthält Funktionen für die folgenden Aufgaben: Das Erzeugen von Objekten. Das Erzeugen von Handles zu einem Objekt. Das Einholen von Informationen über ein Objekt. Das Setzen von Informationen (Attributen) eines Objekts. Das Schließen eines Handles zu einem Objekt. Objekte und Handles zu Objekten verbrauchen Speicher. Deswegen ist es wichtig, nicht mehr benötigte Handles zu schließen und nicht mehr benötigte Objekte aus dem System zu entfernen. Wenn ein Prozess endet, schließt das System automatisch seine Handles und entfernt Objekte, die nur noch von diesem Prozess genutzt wurden. Dies geschieht jedoch nicht bei der Beendigung eines einzelnen Threads (außer wenn dies der letzte Thread des Prozesses ist, und somit auch der Prozess beendet wird). Chr. Vogt, FH München 10

11 4.1.1 Arten von Objekten Unter Windows gibt es drei Arten von Objekten: User Objekte GDI (graphics device interface) Objekte Kernel-Objekte User Objekte sind z.b. Fenster und Menüs, GDI Objekte Bitmaps oder Fonts. In dieser Vorlesung interessieren uns nur die Kernel-Objekte. Zu diesen gehören: Prozesse und Threads, Events, Mutexes, Semaphore und Timer (für die Synchronisation), Mailslots und Pipes (für die Kommunikation), Dateien File mappings und Heaps (für die Speicherverwaltung). Der Begriff Kernel-Objekte ist etwas irreführend, da nicht alle diese Objekte auch Objekte des Betriebssystem-Kernels sind. So sind z.b. Mailslots und Pipes Erfindungen des Win32- Subsystems, von denen der Kernel des Betriebssystems nichts weiß Benannte Objekte Die einfachste Methode, um Kernel-Objekte über mehrere Prozesse hinweg zu verwenden, liegt im Benennen der Objekte. Nicht alle, aber viele der Kernel-Objekte lassen sich benennen. Für benennbare Objekte hat die entsprechende Createxxx-Funktion einen Parameter lpszname, für den die Adresse eines durch eine 0 abgeschlossenen Strings angegeben werden kann. Andere Prozesse können dann mit einer Openxxx-Funktion unter Angabe des Namens ein Handle zu diesem Objekt öffnen. Zu beachten ist, dass all diese Objekte sich einen gemeinsamen, systemweiten Namensraum teilen. Bei der Namensvergabe sollte man also vorsichtig sein und sich am besten vorab eine vernünftige Konvention überlegen. 4.2 Handles Applikationen können Objekte mit Hilfe von API-Funktionen manipulieren. Da der Zugriff auf die Datenstrukturen eines Kernel-Objekts nur dem Betriebssystem-Kernel möglich ist, müssen sie dazu allerdings erst ein sog. Handle zu dem Objekt anfordern ( öffnen ). Jeder Prozess hat eine Handle-Tabelle. Diese wird nur für Kernel-Objekte, nicht aber für User- oder GDI-Objekte verwendet. Die Handle-Tabelle ist prozessweit und steht somit allen Threads eines Prozesses gleichermaßen zur Verfügung. In der Handle-Tabelle stehen u.a. die Zeiger auf die Datenstrukturen des Kernels für die Objekte. Der Handle-Wert mit dem ein Prozess bzw. seine Threads arbeiten, ist einfach ein 32-bit-Wert, der als Index in diese Chr. Vogt, FH München 11

12 Tabelle verwendet wird. Als Datentyp sollte die Angabe HANDLE verwendet werden, die in den Header-Dateien definiert wird. Beim Erzeugen oder Öffnen eines Objekts wird ein freier Eintrag in der Handle-Tabelle des Prozesses gesucht, und der entsprechende Index als Handle-Wert zurückgegeben. Jedes Objekt enthält einen Zähler für die von Prozessen geöffneten Handles für dieses Objekt, einen weiteren Zähler für die Referenzen des Betriebssystems auf dieses Objekt. Ein Objekt wird dann, und erst dann, automatisch vom System entfernt, wenn diese beiden Zähler auf Null gehen Öffnen und Schließen von Handles Ein Prozess öffnet ein Handle zu einem Objekt, indem er ein neues Objekt mit einer objekttyp-spezifischen Createxxx-Funktion erzeugt, oder indem er ein existierendes Objekt mit einer objekttyp-spezifischen Openxxx-Funktion öffnet. Bei dem Versuch, ein benanntes Objekt zu erzeugen, das bereits existiert, wird das vorhandene Objekt geöffnet und ein Handle zurückgegeben. In diesem Fall ist der Rückgabewert von GetLastError der Code ERROR_ALREADY_EXISTS. Ein Handle wird mit der Win32-API-Funktion CloseHandle wieder geschlossen. Gibt es zu einem Objekt kein Handle mehr, und wird das Objekt auch vom Betriebssystem nicht mehr verwendet, so wird das Objekt selbst automatisch entfernt Vererbung und Duplikation von Handles Handles können von einem Prozess, der mit CreateProcess neu erzeugt wird, geerbt werden. Außerdem können Handles für die Benutzung durch einen anderen Prozess dupliziert werden. In beiden Fällen besteht das Problem, dass der neue bzw. andere Prozess zunächst nichts von den Handles weiß, die ihm auf einmal zur Verfügung stehen. Also muß ihm dies auf irgendeine Art und Weise mitgeteilt werden Vererbung von Handles Beim Öffnen eines Handles zu einem Objekt kann angegeben werden, dass dieses Handle von später erzeugten Prozessen geerbt werden kann. Einige Funktionen haben dafür einen Parameter inheritable (= vererbbar), bei den meisten Funktionen muß dies jedoch in einem Flag in dem Parameter SECURITY_ATTRIBUTES angegeben werden. Die Struktur SECURITY_ATTRIBUTES ist wie folgt definiert: Chr. Vogt, FH München 12

13 typedef struct _SECURITY_ATTRIBUTES { // sa DWORD nlength; LPVOID lpsecuritydescriptor; BOOL binherithandle; } SECURITY_ATTRIBUTES; Die Boole sche Variable binherithandle gibt dabei an, ob das Handle vererbbar ist (TRUE) oder nicht (FALSE). nlength muß die Größe der Struktur in Bytes enthalten (sizeof(...)). SecurityDescriptor ist eine Struktur, die Sicherheitsinformationen für das Objekt enthält, auf die wir hier nicht eingehen wollen. Vererbbare Handles werden nicht automatisch bei der Erzeugung eines Prozesses mit CreateProcess vererbt, sondern nur, wenn der Parameter InheritHandle auf TRUE gesetzt wird. In diesem Fall werden die Einträge der Handle-Tabelle des Vater-Prozesses, die vererbbare Handles beschreiben, in die Handle-Tabelle des neu erzeugten Sohn- Prozesses kopiert, und zwar an genau dieselbe Position wie in der Ursprungstabelle. Der erzeugte Prozess weiß dann allerdings noch nichts von den Handles, die er geerbt hat. Eine Möglichkeit, ihm dies mitzuteilen ist, die Handle-Werte, die ja in beiden Prozessen gleich sind, als ASCII-String in dem Parameter CommandLine der CreateProcess-Funktion zu übergeben (siehe auch das Kapitel über Prozesse und Threads) Duplizieren von Handles Ein Prozess kann eine Kopie eines existierenden Handles an einen anderen Prozess weiterreichen. Dies wird mit der Funktion DuplicateHandle erreicht. Als erstes müssen Quell- und Zielprozess geöffnet werden (mit OpenProcess). Danach kann das Handle übergeben werden mit BOOL DuplicateHandle( HANDLE hsourceprocesshandle, HANDLE hsourcehandle, HANDLE htargetprocesshandle, LPHANDLE lptargethandle, // handle to duplicate // pointer to duplicate handle (Weitere mögliche Parameter wurden weggelassen.) Es können hier insgesamt drei verschiedene Prozesse involviert sein: der Prozess, der DuplicateHandle aufruft, der Quellprozess, von dessen Handles einer dupliziert wird der Zielprozess, der das duplizierte Handle erhält. Zu beachten ist auf jeden Fall die Bedeutung der verschiedenen Handle-Angaben: die Angaben für den Quell- und den Zielprozess sind natürlich aus Sicht des Aufrufers von DuplicateHandle. Der zweite Parameter (hsourcehandle) bezieht sich auf ein Handle im Quellprozess, und der vierte Parameter (lptargethandle) enthält die Adresse einer Handle-Variablen, die den Index des Eintrags in der Handle-Tabelle des Zielprozesses aufnimmt, in den das duplizierte Handle geschrieben wird. Diese Angabe bezieht sich dann also auf den durch lptargetprocesshandle identifizierten Prozess. (Ufff...). Danach muß noch, mit Hilfe irgendeiner Interprozess-Kommunikationsmethode, dem Zielprozess mitgeteilt werden, mit welchem Handle-Wert er dieses duplizierte Handle ansprechen kann. Chr. Vogt, FH München 13

14 Wie man sieht ist die Sache nicht so ganz einfach. Dies ist ein weiterer Grund, lieber mit mehreren Threads innerhalb eines Prozesses zu arbeiten, die sich ja automatisch alle Handles teilen. Und um ein Objekt von mehreren Prozessen aus zu benutzen, ist es in der Regel einfacher, mit benannten Objekten zu arbeiten, als Handles zu duplizieren. Eine mögliche weitere Anwendung von DuplicateHandle besteht darin, für ein Objekt ein Handle mit anderen Zugriffsanforderungen zu erhalten: Man dupliziere ein schon vorhandenes Handle in den eigenen Prozess unter Angabe des gewünschten Zugriffs (Parameter dwdesiredaccess) und schließe das ursprüngliche Handle (oder gebe für den Parameter dwoptions von DuplicateHandle den Wert DUPLICATE_CLOSE_SOURCE an). Auch die Eigenschaft eines Handles, vererbbar zu sein oder nicht, kann auf diese Art geändert werden (Parameter binherithandle). Einfacher ist in diesem Fall aber die Benutzung der Funktion SetHandleInformation. Ein weiteres Beispiel für die Verwendung von DuplicateHandle ist die Situation, in der zwei Threads eines Prozesses dasselbe Objekt verwenden. Wenn beide Threads mit der Arbeit fertig sind, soll das Objekt entfernt werden. Da aber keiner der Threads weiß, ob der andere bereits mit seiner Arbeit fertig ist, verwenden die Threads zwei unterschiedliche Handles. Jeder Thread schließt sein Handle, sobald er das Objekt nicht mehr braucht. Wenn beide Handles geschlossen wurden, wird das Objekt automatisch vom System entfernt. (Natürlich kann man das zweite Handle auch mit einer Openxxx Funktion erhalten.) Pseudohandles Häufig ist es nötig, ein Handle für den eigenen Prozess oder Thread anzugeben, z.b. beim Einholen von Prozess-Informationen mit GetProcessxxx-Funktionen oder dem Ändern von Prozesseigenschaften mit SetProcessxxx-Funktionen, oder beim Duplizieren eines Handles des momentanen Prozesses, wobei der Quellprozess identisch ist mit dem Prozess, der DuplicateHandle aufruft. Als Handle-Angabe für den aktuellen Prozess bzw. Thread können in all diesen Fällen die Funktionen HANDLE GetCurrentProcess(VOID) HANDLE GetCurrentThread(VOID) verwendet werden. Diese liefern jedoch nur sog. Pseudohandle. Ein Pseudohandle kann (und braucht somit) nicht wieder geschlossen werden, und kann nicht vererbt werden. Wenn ein Thread ein echtes Handle für sich oder seinen Prozess benötigt, z.b. um diesen zu vererben, kann er entweder das Pseudohandle duplizieren (was zu einem echten Handle führt), oder mit OpenThread bzw. OpenProcess unter Angabe der Thread- bzw. Prozess- ID (die er wiederum mit GetCurrentThreadId() bzw. GetCurrentProcessId() bekommen kann) ein Handle zu sich oder zu seinem Prozess erhalten. Chr. Vogt, FH München 14

15 5 Prozesse und Threads In diesem Kapitel betrachten wir einige der Win32-API-Funktionen zum Umgang mit Prozessen und Threads. Die Dokumentation nennt für diesen Bereich 67 Funktionen (plus 12 Funktionen für Fibers und 8 für Jobs), von denen wir nur einige wenige behandeln werden. 5.1 Erzeugen von Prozessen Der Prototyp der Funktion CreateProcess zum Erzeugen eines Prozesses lautet: BOOL CreateProcess( LPCTSTR lpapplicationname, // pointer to name of executable module LPTSTR lpcommandline, // pointer to command line string LPSECURITY_ATTRIBUTES lpprocessattributes, // pointer to process security attributes LPSECURITY_ATTRIBUTES lpthreadattributes, // pointer to thread security attributes BOOL binherithandles, // handle inheritance flag DWORD dwcreationflags, // creation flags LPVOID lpenvironment, // pointer to new environment block LPCTSTR lpcurrentdirectory, // pointer to current directory name LPSTARTUPINFO lpstartupinfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpprocessinformation //pointer to PROCESS_INFORMATION Das bedarf sicher noch ein paar Erklärungen. Fangen wir mit der Beschreibung der Funktion an. Vielleicht haben Sie sich bereits über den Parameter lpthreadattributes gewundert, wo wir doch einen Prozess erzeugen wollen. Nun, beim Erzeugen eines Prozesses geschieht folgendes: 1. Das Betriebssystem erzeugt ein internes Prozessobjekt. 2. Das Betriebssystem erzeugt einen 4 GB großen virtuellen Adreßraum für den neuen Prozess und lädt ihn mit dem Programmcode und den Daten der ausführbaren Datei. 3. Das Betriebssystem erzeugt ein internes Threadobjekt für den primären Thread des neuen Prozesses. 4. Der primäre Thread beginnt mit der Ausführung der Startroutine der C-Laufzeitbibliothek, die schließlich die main- bzw. WinMain-Funktion aufruft. Kommen wir nun zu einer näheren Betrachtung der Parameter von CreateProcess. Die ersten beiden Parameter, lpapplicationname und lpcommandline dienen der Angabe des Programms, das in dem neuen Prozess ausgeführt werden soll, sowie möglicher weiterer Angaben in der Kommandozeile. Üblicherweise wird für lpapplicationname der Wert NULL übergeben, und die ausführbare Datei für den neuen Prozess als erstes Token (Wort) der Kommandozeile angegeben. Enthält die Dateiangabe keinen Pfad, so wird die Datei in folgenden Verzeichnissen gesucht: 1. Im Verzeichnis, das die EXE-Datei des aufrufenden Prozesses enthält. 2. Im aktuellen Verzeichnis des aufrufenden Prozesses. 3. Im 32-bit-Systemverzeichnis von Windows. 4. Im 16-bit-Systemverzeichnis von Windows. 5. Im Windows-Verzeichnis. 6. In den in der Umgebungsvariablen PATH aufgeführten Verzeichnissen. Chr. Vogt, FH München 15

16 Bemerkung: Wenn hier und im folgenden aufrufender Prozess oder aktueller Prozess steht ist immer der Prozess gemeint, zu dem der aufrufende oder aktuelle Thread gehört. Der Rest der Kommandozeile, nach dem ersten Token, wird an die WinMain-Funktion übergeben und landet schließlich in den globalen Variablen argc und argv. Ein Programm kann aber auch mit der Funktion GetCommandLine einen Zeiger auf die gesamte Kommandozeile erhalten. Die Parameter lpprocessattributes und lpthreadattributes sind Zeiger auf Strukturen vom Typ SECURITY_ATTRIBUTES für den Prozess bzw. seinen primären Thread (der ja gleich miterzeugt wird). Zur Erinnerung: Diese Struktur enthält zwei Angaben: 1. Einen Security Descriptor, der Sicherheitsinformationen für das Objekt angibt. 2. Die Angabe, ob das Handle zu diesem Objekt vererbbar sein soll. Bei Angabe von NULL wird ein Standard-Security-Descriptor verwendet, und das Handle ist nicht vererbbar. Der Parameter binherithandles gibt an, ob vererbbare Handles des aufrufenden Prozesses an den zu erzeugenden Prozess vererbt werden sollen. Der Parameter dwcreationflags enthält einige Flags, die die Erzeugung des neuen Prozesses steuern. Eine vollständige Liste der möglichen Flags finden Sie in der Dokumentation. Zwei wichtige Flags sind: CREATE_NEW_CONSOLE Für Konsolen-Anwendungen: Der neue Prozess erhält ein eigenes Konsolenfenster. Standardmäßig benutzt er das Konsolenfenster des aufrufenden Prozesses mit. CREATE_SUSPENDED Der primäre Thread des Prozesses wird im Zustand SUSPENDED erzeugt und läuft erst nach Aufruf der Funktion ResumeThread los. Außerdem steuert der Parameter dwcreationflags die Prioritätsklasse des neuen Prozesses. Die möglichen Angaben hierfür sind: IDLE_PRIORITY_CLASS NORMAL_PRIORITY_CLASS HIGH_PRIORITY_CLASS REALTIME_PRIORITY_CLASS Standardmäßig wird die NORMAL_PRIORITY_CLASS verwendet (mit Ausnahmen, siehe Doku). Nähere Informationen über Prioritäten finden Sie in der Betriebssystemvorlesung. Die Parameter lpenvironment und lpcurrentdirectory dienen der Angabe eines Bereiches mit Umgebungsvariablen bzw. des Standard-Verzeichnisses für den neuen Prozess. Bei Angabe von NULL erbt der neue Prozess diese Angaben vom aufrufenden Prozess. Der Parameter lpstartupinfo zeigt auf eine Struktur des Typs STARTUPINFO, die vor allem Angaben darüber enthält, wie das Hauptfenster der Applikation aussehen soll (Größe, Position etc.). Um Standardwerte zu verwenden, kann man alle Elemente in der Struktur auf Null setzen und nur das Feld cb mit der Größe der Struktur initialisieren: Chr. Vogt, FH München 16

17 STARTUPINFO si; ZeroMemory(&si, sizeof(si) si.cb = sizeof(si CreateProcess(..., &si,... Last not least: der Parameter lpprocessinformation. Er verweist auf eine Struktur vom Typ PROCESS_INFORMATION, die von der Funktion CreateProcess mit Informationen gefüllt wird. Die Struktur ist folgendermaßen definiert: typedef struct _PROCESS_INFORMATION { // pi HANDLE hprocess; HANDLE hthread; DWORD dwprocessid; DWORD dwthreadid; } PROCESS_INFORMATION; Hier finden wir nun also die Handles für den erzeugten Prozess und für dessen primären Thread und außerdem deren numerische Identifikationen. Die Funktion CreateProcess öffnet also ungefragt je ein Handle zu dem neuen Prozess und seinem primären Thread. Vergessen Sie nicht, diese Handles wieder zu schließen! Wenn der aufrufende Prozess sie überhaupt nicht benötigt, schließen Sie sie am besten sofort nach Aufruf von CreateProcess. Sie wissen ja, dass das Prozess- und das Threadobjekt nicht entfernt werden können, solange noch offene Handles für sie existieren! Nach all diesen Erklärungen jetzt aber schnell ein Beispiel, um zu sehen, dass es gar nicht so kompliziert ist: STARTUPINFO si; PROCESS_INFORMATION pi; // Vorbereiten der STARTUPINFO-Struktur: ZeroMemory(&si, sizeof(si) si.cb = sizeof(si CreateProcess( NULL, // EXE-Datei wird im 2. Argument angegeben "exe_file", // Keine weiteren Angaben in der Kommandozeile NULL, // Standard-Sicherheit, Handle nicht vererbbar NULL, // Standard-Sicherheit, Handle nicht vererbbar FALSE, // Handles nicht vererben 0, // Keine Flags, d.h. u.a. NORMAL_PRIORITY_CLASS NULL, // Umgebungsvariablen "vererben" NULL, // Standard-Verzeichnis "vererben" &si, // STARTUPINFO &pi // PROCESS_INFORMATION // Handles schließen: CloseHandle(pi.hProcess CloseHandle(pi.hThread Chr. Vogt, FH München 17

18 5.2 Beenden von Prozessen Kommen wir nun zum Beenden eines Prozesses. Dies kann auf dreierlei Arten geschehen: 1. Ein Thread im Prozess ruft die Funktion ExitProcess auf. 2. Ein Thread in einem anderen Prozess ruft die Funktion TerminateProcess auf. 3. Alle Threads in einem Prozess arbeiten bis zu ihrem natürlichen Ende. Bei Beendigung des letzten Threads eines Prozesses wird dann automatisch auch der Prozess beendet. Der Aufruf von ExitProcess: VOID ExitProcess( UINT uexitcode // exit code for all threads beendet zunächst alle noch vorhandenen Threads des Prozesses und anschließend den Prozess selbst. Das gleiche geschieht beim Aufruf von TerminateProcess: BOOL TerminateProcess( HANDLE hprocess, UINT uexitcode // handle to the process // exit code for the process wobei dieser Aufruf aber durch Angabe eines Handles auch für einen anderen als den eigenen Prozess durchgeführt werden kann. Im Allgemeinen sollte man jedoch auf die Verwendung von TerminateProcess verzichten, da dabei keine DLLs benachrichtigt werden, was zu einem fehlerhaften Abschluß des Prozesses führen kann. Der Exit-Code, der bei diesen Funktionen angegeben werden kann, kann von anderen Prozessen mit GetExitCodeProcess abgefragt werden. Solange der Prozess noch läuft liefert diese Funktion den Wert STILL_ACTIVE. Bei der Terminierung eines Prozesses geschieht folgendes: 1. Alle Threads des Prozesses beenden ihre Ausführung. 2. Alle vom Prozess reservierten Benutzer- und GDI-Objekte werden freigegeben, und alle Kernel-Objekte werden geschlossen (d.h. die Handles darauf werden geschlossen). 3. Das Prozessobjekt wechselt in den Signalled State (ebenso seine Threadobjekte). 4. Der Exitcode des Prozesses wechselt von STILL_ACTIVE in den Code, der der Funktion ExitProcess bzw. TerminateProcess übergeben wurde. 5. Der interne Benutzerzähler des Prozessobjekts wird um 1 dekrementiert. Wenn ein Prozess terminiert, werden also sein Programmcode und die von ihm reservierten Betriebsmittel aus dem Speicher entfernt. Das ihm entsprechende Prozessobjekt und der dafür benötigte Speicher werden jedoch erst freigegeben, wenn alle noch existierenden Bezüge auf das Objekt (also Handles anderer Prozesse zu diesem Objekt) geschlossen worden sind. Chr. Vogt, FH München 18

19 5.3 Weitere Funktionen für Prozesse Die folgende Tabelle beschreibt kurz einige weitere wichtige Funktionen beim Umgang mit Prozessen. Bei Bedarf oder Interesse lesen Sie bitte Einzelheiten in der Dokumentation nach. GetCurrentProcess GetCurrentProcessId OpenProcess GetPriorityClass SetPriorityClass GetProcessPriorityBoost SetProcessPriorityBoost GetProcessTimes GetProcessWorkingSetSize SetProcessWorkingSetSize Um ein Pseudohandle für den aktuellen Prozess zu erhalten. Um die Process-Identification des aktuellen Prozesses zu erhalten. Um ein Handle zu einem Prozess zu erhalten. Der Prozess wird dabei durch seine Process-Identification angegeben. Abfragen bzw. Ändern der Prioritätsklasse eines Prozesses. Abfragen bzw. Einstellen, ob für alle Threads des Prozesses eine automatische Prioritätenanpassung durch das Betriebssystem gemacht werden soll. Liefert vier Zeitangaben für einen Prozess: Den Erzeugungszeitpunkt des Prozesses. Den Beendigungszeitpunkt des Prozesses. Die Zeit, die alle Threads des Prozesses zusammen im User Mode verbracht haben. Die Zeit, die alle Threads des Prozesses zusammen im Kernel Mode verbracht haben. Anzeigen bzw. Ändern der Minimal- und Maximalgröße des Working Sets des Prozesses. 5.4 Erzeugen von Threads Der Prototyp der Funktion CreateThread zum Erzeugen eines Threads lautet: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpthreadattributes, // pointer to thread security attributes DWORD dwstacksize, // initial thread stack size, in bytes LPTHREAD_START_ROUTINE lpstartaddress, // pointer to thread function LPVOID lpparameter, // argument for new thread DWORD dwcreationflags, // creation flags LPDWORD lpthreadid // pointer to returned thread identifier Als erstes fällt auf, dass im Gegensatz zu CreateProcess der Rückgabewert von CreateThread das Handle für den neuen Thread ist. Der neu erzeugte Thread wird also wiederum ungefragt geöffnet, um Ihnen die Möglichkeit zu geben, den Lieblingsfehler aller Windows-Programmierer zu machen und das Schließen des Handles zu vergessen. Den Parameter lpthreadattributes kennen wir schon von CreateProcess. Chr. Vogt, FH München 19

20 DwStackSize gibt die ursprüngliche Größe des Stacks des neuen Threads an. Wenn 0 angegeben wird, wird der Stack genauso groß angelegt wie der des primären Threads des Prozesses. lpstartaddress ist die Startadresse, an der der neue Thread mit der Ausführung beginnt. Typischerweise ist dies die Adresse einer Funktion, die folgendem Prototyp zu genügen hat: DWORD WINAPI ThreadFunction(LPVOID lpthreadparameter die also einen 32-bit-Zeiger als Argument hat und einen 32-bit-Wert zurückgibt. Der Funktion wird natürlich derjenige Parameter übergeben, der im Parameter lpparameter von CreateThread angegeben wurde. Analog der Funktion WinMain wird auch diese Funktion nicht direkt aufgerufen. Statt dessen ruft das Betriebssystem eine interne Thread-Start-Funktion aus KERNEL32.DLL auf, die die Thread-Funktion aufruft und nach deren Rückkehr den Thread durch Aufruf von ExitThread beendet. Die einzige mögliche Flag für den Parameter dwcreationflags von CreateThread ist CREATE_SUSPENDED. Bei Angabe von 0 für diesen Parameter beginnt der Thread sofort mit der Ausführung. (In Windows XP und 2003 Server wurde eine weitere Flag eingeführt.) Im letzten Parameter, lpthreadid, wird schließlich noch angegeben, wo die Thread-Identification des Threads abgelegt werden soll. Schauen wir uns noch kurz an, welche Schritte das Betriebssystem bei einem Aufruf von CreateThread ausführt: 1. Das Betriebssystem erzeugt ein internes Threadobjekt. Der Rückgabewert von CreateThread ist ein Handle zu diesem Objekt. 2. Das Betriebssystem initialisiert den Exit-Code des Threads mit dem Wert STILL_ACTIVE und setzt den Benutzungszähler des Thread-Objekts auf Das Betriebssystem reserviert eine Struktur vom Typ CONTEXT für den neuen Thread. Diese Struktur enthält die Werte der vom Thread verwendeten CPU-Register zum Zeitpunkt der letzten Unterbrechung des Threads. 4. Das Betriebssystem erzeugt einen eigenen Stack für den neuen Thread. Es reserviert dazu einen entsprechenden Bereich des Prozessadreßraums und ordnet diesem dann (zunächst) zwei physikalische Speicherseiten zu. 5. Die Werte von lpstartadress und lpparameter werden auf dem Stack abgelegt, so dass es so aussieht, als ob dies an die interne Thread-Start-Funktion übergebene Parameter wären. 6. Das Betriebssystem initialisiert das Stackpointer-Register der CONTEXT-Struktur des Threads mit der Adresse der in Schritt 5 auf dem Stack plazierten Werte und weist dem Befehlszähler die Adresse der internen Thread-Start-Funktion zu. 5.5 Beenden von Threads Wie ein Prozess kann auch ein Thread auf dreierlei Arten beendet werden: 1. Der Thread beendet sich selbst durch Aufruf von ExitThread. 2. Ein anderer Thread im selben oder einem anderen Prozess ruft TerminateThread auf. 3. Der Prozess, zu dem der Thread gehört, endet. Chr. Vogt, FH München 20

21 Die Prototypen für ExitThread und TerminateThread lauten: VOID ExitThread( DWORD dwexitcode // exit code for this thread beendet den Thread, der diese Funktion aufruft. Dagegen beendet BOOL TerminateThread( HANDLE hthread, DWORD dwexitcode // handle to the thread // exit code for the thread den durch das Handle angegebenen Thread, der zum selben oder zu einem anderen Prozess gehören kann. Diese Funktion sollte möglichst nicht verwendet werden, da dabei so gut wie keine Aufräumarbeiten in dem zu beendenden Thread durchgeführt werden. So bleibt z.b. dessen Stack allokiert und eine evtl. von ihm benutzte Critical Section wird nicht freigegeben. Beim Beenden eines Threads werden die folgenden Schritte ausgeführt: 1. Alle dem Thread gehörenden Handles zu Fenstern und Hooks (was immer das ist) werden freigegeben. (Alle anderen Handles gehören sowieso nicht dem Thread, sondern dem Prozess!) 2. Das Thread-Objekt geht in den Signalled State. 3. Der Exit-Code des Threads wechselt von STILL_ACTIVE in den Code, der der Funktion ExitThread bzw. TerminateThread übergeben wurde. 4. Falls der betroffene Thread der letzte Thread seines Prozesses ist, wird auch der Prozess beendet. 5. Der interne Benutzungszähler des Thread-Objekts wird um 1 dekrementiert. Das Thread-Objekt und der dafür benötigte Speicher werden noch nicht unbedingt freigegeben sondern erst dann, wenn alle noch existierenden Bezüge auf das Objekt (also Handles anderer Prozesse zu diesem Objekt) geschlossen worden sind. 5.6 Weitere Funktionen für Threads Die folgende Tabelle beschreibt kurz einige weitere wichtige Funktionen beim Umgang mit Threads. Bei Bedarf oder Interesse lesen Sie bitte Einzelheiten in der Dokumentation nach. GetCurrentThread GetCurrentThreadId SuspendThread ResumeThread Sleep Um ein Pseudohandle für den aktuellen Thread zu erhalten. Um die Thread-Identification des aktuellen Threads zu erhalten. Um die Ausführung eines Threads (vorübergehend) anzuhalten bzw. wieder fortzuführen. Unterbrechen der Ausführung des aktuellen Threads für ein bestimmtes Intervall (Angabe in Millisekunden). Chr. Vogt, FH München 21

22 GetThreadPriority SetThreadPriority GetThreadPriorityBoost SetThreadPriorityBoost GetThreadTimes Abfragen bzw. Ändern der (relativen) Priorität eines Threads. Die möglichen Werte sind: THREAD_PRIORITY_IDLE (1 bzw. 16) THREAD_PRIORITY_LOWEST (-2) THREAD_PRIORITY_BELOW_NORMAL (-1) THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL (+1) THREAD_PRIORITY_HIGHEST (+2) THREAD_PRIORITY_TIME_CRITICAL (15 bzw. 31) Abfragen bzw. Einstellen, ob für einen Thread eine automatische Prioritätenanpassung durch das Betriebssystem gemacht werden soll. Liefert vier Zeitangaben für einen Thread: Den Erzeugungszeitpunkt des Threads. Den Beendigungszeitpunkt des Threads. Die Zeit, die der Thread im User Mode verbracht hat. Die Zeit, die der Thread im Kernel Mode verbracht hat. Chr. Vogt, FH München 22

23 6 Synchronisation In diesem Kapitel betrachten wir die im Kernel von Windows vorgesehenen Methoden für die Synchronisation von Threads. Im ersten Abschnitt werden alle Synchronisationsobjekte des Kernels aufgelistet und die Funktionen behandelt, wie auf diese gewartet werden kann. Im zweiten Abschnitt wird auf eine weitere Synchronisationsmethode eingegangen, die das Win32-API anbietet, die Critical Sections. Diese greifen natürlich letztlich auf eine der Methoden des Kernels zurück. Die weiteren Abschnitte behandeln die Benutzung der Kernel-Objekte, die speziell für die Synchronisation zwischen Threads existieren, nämlich Mutexe, Semaphore, Events und Waitable Timer. Im letzten Abschnitt werden dann noch die API-Funktionen besprochen, die für die atomare Ausführung von Operationen existieren. 6.1 Warten auf Synchronisationsobjekte Von allen Objekttypen des Kernels ist eine Teilmenge als sog. Synchronisationsobjekte implementiert. Ein Synchronisationsobjekt befindet sich zu jedem Zeitpunkt in einem von zwei Zuständen: Signalled State Nonsignalled State Die Bedeutung dieser beiden Zustände ist vom Typ des Objektes abhängig (siehe die untenstehende Tabelle). Die Gemeinsamkeit ist, dass ein Thread mit Hilfe der Wait Services des Objektmanagers darauf warten kann, dass ein Objekt in den Signalled State übergeht. Solange das Objekt im Nonsignalled State ist, ist der Thread blockiert. Sobald das Objekt in den Signalled State übergeht, weckt das Betriebssystem einen oder alle (je nach Typ des Objekts) auf dieses Objekt wartenden Threads auf. Die folgende Tabelle zeigt die Objekttypen, die als Synchronisationsobjekte implementiert sind sowie die Bedeutung des Signalled State für den speziellen Objekttyp und gibt an, ob beim Übergang des Objekts in den Signalled State einer oder alle der wartenden Threads geweckt werden. In der Tabelle nicht aufgeführt ist ein weiteres Synchronisationsobjekt des Kernels, das nur dem Win32-Subsystem zur Verfügung steht: die event pairs. Chr. Vogt, FH München 23

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Peter Koos 03. Dezember 2015 0 Inhaltsverzeichnis 1 Voraussetzung... 3 2 Hintergrundinformationen... 3 2.1 Installationsarten...

Mehr

Artikel Schnittstelle über CSV

Artikel Schnittstelle über CSV Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte

Mehr

Step by Step Webserver unter Windows Server 2003. von Christian Bartl

Step by Step Webserver unter Windows Server 2003. von Christian Bartl Step by Step Webserver unter Windows Server 2003 von Webserver unter Windows Server 2003 Um den WWW-Server-Dienst IIS (Internet Information Service) zu nutzen muss dieser zunächst installiert werden (wird

Mehr

Die Dateiablage Der Weg zur Dateiablage

Die Dateiablage Der Weg zur Dateiablage Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen

Mehr

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.

Mehr

Handbuch ECDL 2003 Professional Modul 2: Tabellenkalkulation Vorlagen benutzen und ändern

Handbuch ECDL 2003 Professional Modul 2: Tabellenkalkulation Vorlagen benutzen und ändern Handbuch ECDL 2003 Professional Modul 2: Tabellenkalkulation Vorlagen benutzen und ändern Dateiname: ecdl_p2_02_03_documentation.doc Speicherdatum: 08.12.2004 ECDL 2003 Professional Modul 2 Tabellenkalkulation

Mehr

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Nach dem Update auf die Version 1.70 bekommen Sie eine Fehlermeldung,

Mehr

! " # $ " % & Nicki Wruck worldwidewruck 08.02.2006

!  # $  % & Nicki Wruck worldwidewruck 08.02.2006 !"# $ " %& Nicki Wruck worldwidewruck 08.02.2006 Wer kennt die Problematik nicht? Die.pst Datei von Outlook wird unübersichtlich groß, das Starten und Beenden dauert immer länger. Hat man dann noch die.pst

Mehr

Installationsanleitungen

Installationsanleitungen Installationsanleitungen INPA SGBD-Entwicklungsumgebung (EDIABAS) INPA für Entwickler Bevor Sie EDIABAS / INPA installieren können, müssen Sie sich für den Ordner sgref auf smuc0900 freischalten lassen.

Mehr

Adminer: Installationsanleitung

Adminer: Installationsanleitung Adminer: Installationsanleitung phpmyadmin ist bei uns mit dem Kundenmenüpasswort geschützt. Wer einer dritten Person Zugriff auf die Datenbankverwaltung, aber nicht auf das Kundenmenü geben möchte, kann

Mehr

VB.net Programmierung und Beispielprogramm für GSV

VB.net Programmierung und Beispielprogramm für GSV VB.net Programmierung und Beispielprogramm für GSV Dokumentation Stand vom 26.05.2011 Tel +49 (0)3302 78620 60, Fax +49 (0)3302 78620 69, info@me-systeme.de, www.me-systeme.de 1 Inhaltsverzeichnis Vorwort...2

Mehr

Erstellen einer PostScript-Datei unter Windows XP

Erstellen einer PostScript-Datei unter Windows XP Erstellen einer PostScript-Datei unter Windows XP Sie möchten uns Ihre Druckvorlage als PostScript-Datei einreichen. Um Fehler in der Herstellung von vorneherein auszuschließen, möchten wir Sie bitten,

Mehr

Inhalt. Inhalt... 1. 1. Voraussetzungen... 2. 2. Liegenschaften und Adressen auswählen... 2. 3. Abgleich mit Internet-Office... 5. 4. Dokumente...

Inhalt. Inhalt... 1. 1. Voraussetzungen... 2. 2. Liegenschaften und Adressen auswählen... 2. 3. Abgleich mit Internet-Office... 5. 4. Dokumente... Erstellt: 19.08.2010 Geändert am: 15.08.2011 Autor: Matthias Frey Version: Kunden Package plus 2.1 Anleitung für UNO Inhalt Inhalt... 1 1. Voraussetzungen... 2 2. Liegenschaften und Adressen auswählen...

Mehr

Python Installation. 1 Vorbereitung. 1.1 Download. Diese Anleitung ist für Windows ausgelegt.

Python Installation. 1 Vorbereitung. 1.1 Download. Diese Anleitung ist für Windows ausgelegt. Python Installation 1 Vorbereitung Diese Anleitung ist für Windows ausgelegt. 1.1 Download Python kann online unter https://www.python.org/downloads/ heruntergeladen werden. Hinweis: Im CoderDojo verwenden

Mehr

Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen

Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen Inhalt 1. Die Funambol Software... 3 2. Download und Installation... 3 3.

Mehr

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage .htaccess HOWTO zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage Stand: 21.06.2015 Inhaltsverzeichnis 1. Vorwort...3 2. Verwendung...4 2.1 Allgemeines...4 2.1 Das Aussehen der.htaccess

Mehr

Lizenzen auschecken. Was ist zu tun?

Lizenzen auschecken. Was ist zu tun? Use case Lizenzen auschecken Ihr Unternehmen hat eine Netzwerk-Commuterlizenz mit beispielsweise 4 Lizenzen. Am Freitag wollen Sie Ihren Laptop mit nach Hause nehmen, um dort am Wochenende weiter zu arbeiten.

Mehr

Hex Datei mit Atmel Studio 6 erstellen

Hex Datei mit Atmel Studio 6 erstellen Hex Datei mit Atmel Studio 6 erstellen Es werden generell keine Atmel Studio Dateien ins Repository geladen, da jeder seine Dateien an anderen Orten liegen hat und weil nicht jeder das Atmel Studio 6 benutzt.

Mehr

Neue Schriftarten installieren

Neue Schriftarten installieren .DIE Neue Schriftarten installieren Die Informationen zu jeder Schriftart (Font) sind in jeweils einer Datei untergebracht, der sog. Font-Datei mit der Endung.ttf ttf steht für True Type Font und bedeutet,

Mehr

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen Um die maximale Sicherheit für das Betriebssystem und Ihre persönlichen Daten zu gewährleisten, können Sie Programme von Drittherstellern

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Suche schlecht beschriftete Bilder mit Eigenen Abfragen Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere

Mehr

Leitfaden zur Installation von Bitbyters.WinShutdown

Leitfaden zur Installation von Bitbyters.WinShutdown Leitfaden zur Installation von Bitbyters.WinShutdown für Windows 32 Bit 98/NT/2000/XP/2003/2008 Der BitByters.WinShutDown ist ein Tool mit dem Sie Programme beim Herunterfahren Ihres Systems ausführen

Mehr

In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.

In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können. Tutorial: Wie erfasse ich einen Termin? In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können. Neben den allgemeinen Angaben zu einem

Mehr

DOKUMENTATION VOGELZUCHT 2015 PLUS

DOKUMENTATION VOGELZUCHT 2015 PLUS DOKUMENTATION VOGELZUCHT 2015 PLUS Vogelzucht2015 App für Geräte mit Android Betriebssystemen Läuft nur in Zusammenhang mit einer Vollversion vogelzucht2015 auf einem PC. Zusammenfassung: a. Mit der APP

Mehr

Angebot & Rechnung, Umsatzsteuer, Mein Büro Einrichtung automatischer Datensicherungen

Angebot & Rechnung, Umsatzsteuer, Mein Büro Einrichtung automatischer Datensicherungen Software Angebot & Rechnung, Umsatzsteuer, Mein Büro Thema Einrichtung automatischer Datensicherungen Datum September 2011 So richten Sie automatische Datensicherungen ein Über den Menüpunkt Datei - Datensicherung

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Dieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen.

Dieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen. Millennium SMS Service Schnellübersicht Seite 1 von 6 1. Tägliche Arbeiten mit der SMS Bestätigung Dieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen.

Mehr

ÖKB Steiermark Schulungsunterlagen

ÖKB Steiermark Schulungsunterlagen ÖKB Steiermark Schulungsunterlagen Fotos von Online-Speicher bereitstellen Da das hinzufügen von Fotos auf unsere Homepage recht umständlich und auf 80 Fotos begrenzt ist, ist es erforderlich die Dienste

Mehr

Computeria Solothurn

Computeria Solothurn Computeria Solothurn Seniorinnen und Senioren entdecken den Computer und das Internet Sich mit «TeamViewer» von einem Supporter helfen lassen Diese Anleitung und die Illustrationen wurden unter Mac OS

Mehr

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER Inhalt 1 Einleitung... 1 2 Einrichtung der Aufgabe für die automatische Sicherung... 2 2.1 Die Aufgabenplanung... 2 2.2 Der erste Testlauf... 9 3 Problembehebung...

Mehr

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

Mehr

Wählen Sie bitte START EINSTELLUNGEN SYSTEMSTEUERUNG VERWALTUNG und Sie erhalten unter Windows 2000 die folgende Darstellung:

Wählen Sie bitte START EINSTELLUNGEN SYSTEMSTEUERUNG VERWALTUNG und Sie erhalten unter Windows 2000 die folgende Darstellung: Installation Bevor Sie mit der Installation von MOVIDO 1.0 beginnen, sollten Sie sich vergewissern, dass der Internet Information Server (IIS) von Microsoft installiert ist. Um dies festzustellen, führen

Mehr

TeamSpeak3 Einrichten

TeamSpeak3 Einrichten TeamSpeak3 Einrichten Version 1.0.3 24. April 2012 StreamPlus UG Es ist untersagt dieses Dokument ohne eine schriftliche Genehmigung der StreamPlus UG vollständig oder auszugsweise zu reproduzieren, vervielfältigen

Mehr

FastViewer Remote Edition 2.X

FastViewer Remote Edition 2.X FastViewer Remote Edition 2.X Mit der FastViewer Remote Edition ist es möglich beliebige Rechner, unabhängig vom Standort, fernzusteuern. Die Eingabe einer Sessionnummer entfällt. Dazu muß auf dem zu steuernden

Mehr

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten Was sind Berechtigungen? Unter Berechtigungen werden ganz allgemein die Zugriffsrechte auf Dateien und Verzeichnisse (Ordner) verstanden.

Mehr

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt Inhaltsverzeichnis Aufgabe... 1 Allgemein... 1 Active Directory... 1 Konfiguration... 2 Benutzer erstellen... 3 Eigenes Verzeichnis erstellen... 3 Benutzerkonto erstellen... 3 Profil einrichten... 5 Berechtigungen

Mehr

10.3.1.10 Übung - Konfigurieren einer Windows-XP-Firewall

10.3.1.10 Übung - Konfigurieren einer Windows-XP-Firewall 5.0 10.3.1.10 Übung - Konfigurieren einer Windows-XP-Firewall Drucken Sie diese Übung aus und führen Sie sie durch. In dieser Übung werden Sie erfahren, wie man die Windows XP-Firewall konfiguriert und

Mehr

Visual Basic Express Debugging

Visual Basic Express Debugging Inhalt Dokument Beschreibung... 1 Projekt vorbereiten... 1 Verknüpfung zu Autocad/ProStructures einstellen... 2 Debugging... 4 Autocad/ProSteel Beispiel... 5 Dokument Beschreibung Debuggen nennt man das

Mehr

GeoPilot (Android) die App

GeoPilot (Android) die App GeoPilot (Android) die App Mit der neuen Rademacher GeoPilot App machen Sie Ihr Android Smartphone zum Sensor und steuern beliebige Szenen über den HomePilot. Die App beinhaltet zwei Funktionen, zum einen

Mehr

NetStream Helpdesk-Online. Verwalten und erstellen Sie Ihre eigenen Tickets

NetStream Helpdesk-Online. Verwalten und erstellen Sie Ihre eigenen Tickets Verwalten und erstellen Sie Ihre eigenen Tickets NetStream GmbH 2014 Was ist NetStream Helpdesk-Online? NetStream Helpdesk-Online ist ein professionelles Support-Tool, mit dem Sie alle Ihre Support-Anfragen

Mehr

Einrichten des IIS für VDF WebApp. Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications

Einrichten des IIS für VDF WebApp. Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications Windows 8 Systemsteuerung > Programme > Windows Features aktivieren / deaktivieren > Im Verzeichnisbaum

Mehr

Dokumentenverwaltung. Copyright 2012 cobra computer s brainware GmbH

Dokumentenverwaltung. Copyright 2012 cobra computer s brainware GmbH Dokumentenverwaltung Copyright 2012 cobra computer s brainware GmbH cobra Adress PLUS ist eingetragenes Warenzeichen der cobra computer s brainware GmbH. Andere Begriffe können Warenzeichen oder anderweitig

Mehr

32.4 Anpassen von Menüs und Symbolleisten 795i

32.4 Anpassen von Menüs und Symbolleisten 795i 32.4 Anpassen von Menüs und Symbolleisten 795i Fortsetzung der Seiten in der 8. Auflage 32.4 Anpassen von Menüs und Symbolleisten 32.4.1 Anpassen von Menüs Die Menüs können um folgende Typen von Optionen

Mehr

Eine Einführung in die Installation und Nutzung von cygwin

Eine Einführung in die Installation und Nutzung von cygwin Eine Einführung in die Installation und Nutzung von cygwin 1 1. Woher bekomme ich cygwin? Cygwin ist im Internet auf http://www.cygwin.com/ zu finden. Dort lädt man sich die setup.exe in ein beliebiges

Mehr

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI TTS - TinyTimeSystem Unterrichtsprojekt BIBI Mathias Metzler, Philipp Winder, Viktor Sohm 28.01.2008 TinyTimeSystem Inhaltsverzeichnis Problemstellung... 2 Lösungsvorschlag... 2 Punkte die unser Tool erfüllen

Mehr

Informatik I Tutorial

Informatik I Tutorial ETH Zürich, D-INFK/D-BAUG Herbstsemester 2015 Dr. Martin Hirt Daniel Jost Informatik I Tutorial Dieses Tutorial hat zum Ziel, die notwendigen Tools auf dem eigenen Computer zu installieren, so dass ihr

Mehr

Allgemeine USB Kabel Installation und Troubleshooting

Allgemeine USB Kabel Installation und Troubleshooting Allgemeine USB Kabel Installation und Troubleshooting Inhalt Installation der Treiber... 2 BrotherLink... 4 SilverLink... 5 Bei Problemen... 6 So rufen Sie den Geräte-Manager in den verschiedenen Betriebssystemen

Mehr

Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG

Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG Um mit IOS2000/DIALOG arbeiten zu können, benötigen Sie einen Webbrowser. Zurzeit unterstützen wir ausschließlich

Mehr

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH MORE Profile Pass- und Lizenzverwaltungssystem erstellt von: Thorsten Schumann erreichbar unter: thorsten.schumann@more-projects.de Stand: MORE Projects GmbH Einführung Die in More Profile integrierte

Mehr

Einführung zum Arbeiten mit Microsoft Visual C++ 2010 Express Edition

Einführung zum Arbeiten mit Microsoft Visual C++ 2010 Express Edition In den nachfolgenden Schritten finden Sie beschrieben, wie Sie in der Entwicklungsumgebung Microsoft Visual Studio 2010 eine Projektmappe, ein Projekt und einen ersten Quellcode erstellen, diesen kompilieren,

Mehr

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung Anleitung zur Daten zur Datensicherung und Datenrücksicherung Datensicherung Es gibt drei Möglichkeiten der Datensicherung. Zwei davon sind in Ges eingebaut, die dritte ist eine manuelle Möglichkeit. In

Mehr

IDEP / KN8 für WINDOWS. Schnellstart

IDEP / KN8 für WINDOWS. Schnellstart IDEP / KN8 für WINDOWS Schnellstart 1. INSTALLATION 1.1 ÜBER DAS INTERNET Auf der Webseite von Intrastat (www.intrastat.be) gehen Sie nach der Sprachauswahl auf den Unterpunkt Idep/Gn8 für Windows. Dann

Mehr

Lokale Installation von DotNetNuke 4 ohne IIS

Lokale Installation von DotNetNuke 4 ohne IIS Lokale Installation von DotNetNuke 4 ohne IIS ITM GmbH Wankelstr. 14 70563 Stuttgart http://www.itm-consulting.de Benjamin Hermann hermann@itm-consulting.de 12.12.2006 Agenda Benötigte Komponenten Installation

Mehr

Vorgehensweise bei der Installation Bob50SQL für einen unabhängigen PC.

Vorgehensweise bei der Installation Bob50SQL für einen unabhängigen PC. Vorgehensweise bei der Installation Bob50SQL für einen unabhängigen PC. Wichtiger Hinweis Diese Installation ist für einen unabhängigen PC (Bob50 ist auf einen einzigen PC installiert ohne auf irgendein

Mehr

Der Kalender im ipad

Der Kalender im ipad Der Kalender im ipad Wir haben im ipad, dem ipod Touch und dem iphone, sowie auf dem PC in der Cloud einen Kalender. Die App ist voreingestellt, man braucht sie nicht laden. So macht es das ipad leicht,

Mehr

Outlook 2000 Thema - Archivierung

Outlook 2000 Thema - Archivierung interne Schulungsunterlagen Outlook 2000 Thema - Inhaltsverzeichnis 1. Allgemein... 3 2. Grundeinstellungen für die Auto in Outlook... 3 3. Auto für die Postfach-Ordner einstellen... 4 4. Manuelles Archivieren

Mehr

System-Update Addendum

System-Update Addendum System-Update Addendum System-Update ist ein Druckserverdienst, der die Systemsoftware auf dem Druckserver mit den neuesten Sicherheitsupdates von Microsoft aktuell hält. Er wird auf dem Druckserver im

Mehr

FTP-Server einrichten mit automatischem Datenupload für SolarView@Fritzbox

FTP-Server einrichten mit automatischem Datenupload für SolarView@Fritzbox FTP-Server einrichten mit automatischem Datenupload für SolarView@Fritzbox Bitte beachten: Der im folgenden beschriebene Provider "www.cwcity.de" dient lediglich als Beispiel. Cwcity.de blendet recht häufig

Mehr

PHPNuke Quick & Dirty

PHPNuke Quick & Dirty PHPNuke Quick & Dirty Dieses Tutorial richtet sich an all die, die zum erstenmal an PHPNuke System aufsetzen und wirklich keine Ahnung haben wie es geht. Hier wird sehr flott, ohne grosse Umschweife dargestellt

Mehr

OP-LOG www.op-log.de

OP-LOG www.op-log.de Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server

Mehr

2. Die eigenen Benutzerdaten aus orgamax müssen bekannt sein

2. Die eigenen Benutzerdaten aus orgamax müssen bekannt sein Einrichtung von orgamax-mobil Um die App orgamax Heute auf Ihrem Smartphone nutzen zu können, ist eine einmalige Einrichtung auf Ihrem orgamax Rechner (bei Einzelplatz) oder Ihrem orgamax Server (Mehrplatz)

Mehr

INSTALLATION VON INSTANTRAILS 1.7

INSTALLATION VON INSTANTRAILS 1.7 INSTALLATION VON INSTANTRAILS 1.7 InstantRails 1.7 ist ein Paket, das Ruby, Rails, Apache, MySQL und andere Tools, z.b. phpmyadmin in vorkonfigurierter Form enthält. Das Paket muss in einem Verzeichnis

Mehr

Erstellen einer digitalen Signatur für Adobe-Formulare

Erstellen einer digitalen Signatur für Adobe-Formulare Erstellen einer digitalen Signatur für Adobe-Formulare (Hubert Straub 24.07.13) Die beiden Probleme beim Versenden digitaler Dokumente sind einmal die Prüfung der Authentizität des Absenders (was meist

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

Qt-Projekte mit Visual Studio 2005

Qt-Projekte mit Visual Studio 2005 Qt-Projekte mit Visual Studio 2005 Benötigte Programme: Visual Studio 2005 Vollversion, Microsoft Qt 4 Open Source s. Qt 4-Installationsanleitung Tabelle 1: Benötigte Programme für die Qt-Programmierung

Mehr

Outlook-Daten komplett sichern

Outlook-Daten komplett sichern Outlook-Daten komplett sichern Komplettsicherung beinhaltet alle Daten wie auch Kontakte und Kalender eines Benutzers. Zu diesem Zweck öffnen wir OUTLOOK und wählen Datei -> Optionen und weiter geht es

Mehr

DFÜ-Netzwerk öffnen Neue Verbindung herstellen Rufnummer einstellen bundesweit gültige Zugangsnummer Benutzererkennung und Passwort

DFÜ-Netzwerk öffnen Neue Verbindung herstellen Rufnummer einstellen bundesweit gültige Zugangsnummer Benutzererkennung und Passwort Windows 95/98/ME DFÜ-Netzwerk öffnen So einfach richten Sie 01052surfen manuell auf Ihrem PC oder Notebook ein, wenn Sie Windows 95/98/ME verwenden. Auf Ihrem Desktop befindet sich das Symbol "Arbeitsplatz".

Mehr

Startmenü So einfach richten Sie 010090 surfen manuell auf Ihrem PC oder Notebook ein, wenn Sie Windows XP verwenden.

Startmenü So einfach richten Sie 010090 surfen manuell auf Ihrem PC oder Notebook ein, wenn Sie Windows XP verwenden. Windows XP Startmenü So einfach richten Sie 010090 surfen manuell auf Ihrem PC oder Notebook ein, wenn Sie Windows XP verwenden. Gehen Sie auf Start und im Startmenu auf "Verbinden mit" und danach auf

Mehr

Arbeiten mit dem Outlook Add-In

Arbeiten mit dem Outlook Add-In Arbeiten mit dem Outlook Add-In Das Outlook Add-In ermöglicht Ihnen das Speichern von Emails im Aktenlebenslauf einer Akte. Außerdem können Sie Namen direkt aus BS in Ihre Outlook-Kontakte übernehmen sowie

Mehr

Tutorial - www.root13.de

Tutorial - www.root13.de Tutorial - www.root13.de Netzwerk unter Linux einrichten (SuSE 7.0 oder höher) Inhaltsverzeichnis: - Netzwerk einrichten - Apache einrichten - einfaches FTP einrichten - GRUB einrichten Seite 1 Netzwerk

Mehr

SharePoint Workspace 2010 Installieren & Konfigurieren

SharePoint Workspace 2010 Installieren & Konfigurieren [Geben Sie Text ein] SharePoint Workspace 2010 Installieren & Konfigurieren SharePoint Workspace 2010 Installieren & Konfigurieren Inhalt SharePoint Workspace 2010 Installieren... 2 SharePoint Workspace

Mehr

Urlaubsregel in David

Urlaubsregel in David Urlaubsregel in David Inhaltsverzeichnis KlickDown Beitrag von Tobit...3 Präambel...3 Benachrichtigung externer Absender...3 Erstellen oder Anpassen des Anworttextes...3 Erstellen oder Anpassen der Auto-Reply-Regel...5

Mehr

Die Erstellung eigener Strukturprofile

Die Erstellung eigener Strukturprofile Die Erstellung eigener Strukturprofile Manchmal ist es nötig, eigene Profile zu Erstellen, die man dann mittels Gestellgenerator verbaut. Diese Strukturprofile werden in einer Benutzerbezogenen Bibliothek

Mehr

Ablaufbeschreibung für das neu Aufsetzen von Firebird und Interbase Datenbanken mit der IBOConsole

Ablaufbeschreibung für das neu Aufsetzen von Firebird und Interbase Datenbanken mit der IBOConsole Lavid-F.I.S. Ablaufbeschreibung für das neu Aufsetzen von Firebird und Interbase Datenbanken mit der Lavid Software GmbH Dauner Straße 12, D-41236 Mönchengladbach http://www.lavid-software.net Support:

Mehr

Installationsanleitung CLX.PayMaker Home

Installationsanleitung CLX.PayMaker Home Installationsanleitung CLX.PayMaker Home Inhaltsverzeichnis 1. Installation und Datenübernahme... 2 2. Erste Schritte Verbindung zur Bank einrichten und Kontoinformationen beziehen... 4 3. Einrichtung

Mehr

Übung: Verwendung von Java-Threads

Übung: Verwendung von Java-Threads Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum

Mehr

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken. Seite erstellen Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken. Es öffnet sich die Eingabe Seite um eine neue Seite zu erstellen. Seiten Titel festlegen Den neuen

Mehr

Über die Internetseite www.cadwork.de Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

Über die Internetseite www.cadwork.de Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt. Internet, Codes und Update ab Version 13 Um Ihnen einen möglichst schnellen Zugang zu den aktuellsten Programmversionen zu ermöglichen liegen Update-Dateien für Sie im Internet bereit. Es gibt drei Möglichkeiten

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

KVIrc installieren (win) i. KVIrc installieren (win)

KVIrc installieren (win) i. KVIrc installieren (win) i KVIrc installieren (win) ii REVISION HISTORY NUMBER DATE DESCRIPTION NAME 1.0 May 08 T iii Contents 1 Einleitung 1 1.1 Über KVIrc...................................................... 1 1.2 Vorbereitungen....................................................

Mehr

Informatik 1 Tutorial

Informatik 1 Tutorial ETH Zürich, D-INFK/D-BAUG Herbstsemester 2014 Dr. Martin Hirt Christian Badertscher Informatik 1 Tutorial Dieses Tutorial hat zum Ziel, die notwendigen Tools auf dem eigenen Computer zu installieren, so

Mehr

Datensicherung. Beschreibung der Datensicherung

Datensicherung. Beschreibung der Datensicherung Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten

Mehr

Was man mit dem Computer alles machen kann

Was man mit dem Computer alles machen kann Was man mit dem Computer alles machen kann Wie komme ich ins Internet? Wenn Sie einen Computer zu Hause haben. Wenn Sie das Internet benutzen möchten, dann brauchen Sie ein eigenes Programm dafür. Dieses

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Installieren von Microsoft Office 2012-09-12 Version 2.1

Installieren von Microsoft Office 2012-09-12 Version 2.1 Installieren von Microsoft Office 2012-09-12 Version 2.1 INHALT Installieren von Microsoft Office... 2 Informationen vor der Installation... 2 Installieren von Microsoft Office... 3 Erste Schritte... 7

Mehr

Inhalt. meliarts. 1. Allgemeine Informationen... 2 2. Administration... 2 2.1 Aufruf... 2 2.2 Das Kontextmenü... 3 3. E-Mail Vorlagen...

Inhalt. meliarts. 1. Allgemeine Informationen... 2 2. Administration... 2 2.1 Aufruf... 2 2.2 Das Kontextmenü... 3 3. E-Mail Vorlagen... Inhalt 1. Allgemeine Informationen... 2 2. Administration... 2 2.1 Aufruf... 2 2.2 Das Kontextmenü... 3 3. E-Mail Vorlagen... 4 Seite 1 von 7 meliarts 1. Allgemeine Informationen meliarts ist eine Implementierung

Mehr

Erstellen der Barcode-Etiketten:

Erstellen der Barcode-Etiketten: Erstellen der Barcode-Etiketten: 1.) Zuerst muss die Schriftart Code-39-Logitogo installiert werden! Das ist eine einmalige Sache und muss nicht zu jeder Börse gemacht werden! Dazu speichert man zunächst

Mehr

Installation einer C++ Entwicklungsumgebung unter Windows --- TDM-GCC und Eclipse installieren

Installation einer C++ Entwicklungsumgebung unter Windows --- TDM-GCC und Eclipse installieren Installation einer C++ Entwicklungsumgebung unter Windows --- TDM-GCC und Eclipse installieren 1 32- oder 64-bit Windows feststellen In den nachfolgenden Schritten ist es nötig, dass Sie wissen, ob Sie

Mehr

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Diese Verbindung muss einmalig eingerichtet werden und wird benötigt, um den Zugriff vom privaten Rechner oder der Workstation im Home Office über

Mehr

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten 2008 netcadservice GmbH netcadservice GmbH Augustinerstraße 3 D-83395 Freilassing Dieses Programm ist urheberrechtlich geschützt. Eine Weitergabe

Mehr

Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb

Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb CashPro basiert auf Accesstechnologie 2003 und ist auch unter den aktuellen Accessversionen 2007 bis 2013 einsetzbar und Mehrbenutzerfähig.

Mehr

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen?

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen? Anleitung für Evident Seite 1 Anleitung für Evident-Anwender: Einbinden der MIZ-Dokumente in Evident. Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen? Zunächst müssen Sie entscheiden,

Mehr

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Anmeldung http://www.ihredomain.de/wp-admin Dashboard Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Das Dashboard gibt Ihnen eine kurze Übersicht, z.b. Anzahl der Beiträge,

Mehr

Aber mancher braucht diese Funktionalität halt, doch wo ist sie unter Windows 8 zu finden?

Aber mancher braucht diese Funktionalität halt, doch wo ist sie unter Windows 8 zu finden? Windows 8 - Tipps 1. Versteckte Dateien und Ordner anzeigen Wie auch bei den Vorgängerversionen blendet Windows 8 geschützte und versteckte Dateien zunächst aus. Wer nicht direkt etwas mit dieser Materie

Mehr

2 DAS BETRIEBSSYSTEM. 2.1 Wozu dient das Betriebssystem. 2.2 Die Bildschirmoberfläche (Desktop) Themen in diesem Kapitel: Das Betriebssystem

2 DAS BETRIEBSSYSTEM. 2.1 Wozu dient das Betriebssystem. 2.2 Die Bildschirmoberfläche (Desktop) Themen in diesem Kapitel: Das Betriebssystem 2 DAS BETRIEBSSYSTEM Themen in diesem Kapitel: Das Betriebssystem Die Windows-Oberfläche Elemente eines Fensters 2.1 Wozu dient das Betriebssystem Das Betriebssystem (engl.: operating system, kurz: OS)

Mehr

Dokumentation: Balanced Scorecard

Dokumentation: Balanced Scorecard Dokumentation: Balanced Scorecard 1. Einleitung Eine Balanced Scorecard (BSC) ist eine kennzahlenbasierte Managementmethode, welche sowohl Visionen als auch Strategien eines Unternehmens und relevante

Mehr

Anleitung für Zugriff auf den LEM-FTP-Server

Anleitung für Zugriff auf den LEM-FTP-Server Anleitung für Zugriff auf den LEM-FTP-Server Diese Anleitung hilft Ihnen dabei, Zugang zum FTP-Server des Laboratoriums für Elektronenmikroskopie der Universität Karlsruhe (TH) zu bekommen. Sie werden

Mehr