vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2017
 
zurück
Rubrik: Allgemein   |   VB-Versionen: VB5, VB615.01.01
WinAPI-Funtkionen in VB nutzen

Manchmal bietet Visual Basic nicht die Funktion, die der Programmierer gerade benötigt. Dann können Sie von Visual Basic aus auch direkt auf die Funktionen der Windows-API zugreifen.

Autor:  Ingo SteinhausBewertung:     [ Jetzt bewerten ]Views:  19.015 

Manchmal bietet Visual Basic nicht die Funktion, die der Programmierer gerade benötigt. Dann können Sie von Visual Basic aus auch direkt auf die Funktionen der Windows-API zugreifen.

Flirt mit dem Windows-System

Vermittler zwischen Windows und Software: Die Windows-API stellt die Funktionen des Betriebssystems allen Anwendungen zur Verfügung

Windows ist nicht nur eine grafische Benutzeroberfläche. Das Betriebssystem bietet auch eine Schnittstelle, mit deren Hilfe sich die unzähligen Windows-Funktionen nutzen lassen: die sogenannte Windows-API oder kurz Win-API. API steht dabei für "Application Programming Interface", zu deutsch etwa "Programmierschnittstelle". Sie können sich darunter eine Art Sprache vorstellen, die fest in Windows eingebaut ist und allen Arten von Anwendungen zur Verfügung steht. Erst diese API ermöglicht es überhaupt, in eigenen Programmen Elemente und Funktionen von Windows zu nutzen, zum Beispiel den typischen Dialog zum Öffnen oder Speichern von Dateien, Menüleisten, die Windows-Fenster oder die Internet-Funktionen, die das Betriebssystem bietet.

Ohne Win-API müsste jeder Entwickler selbst Dateidialoge oder Fensterelemente wie Fensterbalken, Rollbalken, Schließbox etc. programmieren. Der einheitliche Look von Anwendungen wäre schnell dahin – wie damals zu DOS-Zeiten, als es noch keine einheitliche Benutzerführung gab.

APIs bietet in der Regel jedes Betriebssystem, denn sie garantieren ein einheitliches Aussehen der Anwendungen. Unter Windows gibt es in allen wichtigen Programmiersprachen für das System gibt es die Möglichkeit, auf die Funktionen der Win-API zuzugreifen. So auch in Visual Basic (VB) und Visual Basic for Applications (VBA).

Die API-Funktionen befinden sich in zahlreichen Bibliotheksdateien mit der Erweiterung "DLL" (Dynamic Link Library). Sie befinden sich im Windows-Systemverzeichnis. DLL-Dateien sind keine direkt ausführbaren Programme, sondern können von anderen Anwendungen bei Bedarf als Programm-Modul genutzt und dann ganz oder teilweise in den Arbeitsspeicher geladen werden.

Die wichtigsten API-Bibliotheken sind ständig im Arbeitsspeicher vorhanden, damit das Betriebssystem schnell auf sie zugreifen kann und sie nicht erst von Festplatte laden muss. Das beschleunigt das Arbeitstempo eines Betriebssystems erheblich. Aber eine Reihe von Diensten wie zum Beispiel die "Windows Sockets" werden nur geladen, wenn ein Programm sie benötigt. Endet die Anwendung, werden sie wieder aus dem Hauptspeicher entfernt.

Deklaration von API-Funktionen

Bevor Sie eine API-Funktion nutzen können, müssen Sie Visual Basic erst darüber informieren, dass Sie die Windows-API nutzen wollen. Für diesen Zweck kennt Visual Basic die sogenannte "Declare"-Anweisung. Sie informiert den Interpreter darüber, wo die Funktion zu finden ist und wie sie benutzt werden soll. Die Anweisung benötigt die folgenden Informationen:

  • Den Namen der Funktion.
  • Die Bibliothek, in der sich die Funktion befindet, also beispielsweise "Kernel32", "User32", "Shell32" oder "GDI32".
  • Eventuell einen Alias-Namen.
  • Die Parameter der Funktion. Den Datentyp, den die Funktion zurückgibt.
Eine typische Declare-Anweisung sieht so aus:

Declare Function GetDriveType Lib "kernel32" _
  Alias "GetDriveTypeA" ( _
  ByVal nDrive As String) As Long

GetDriveTyp: Der Funktionsname.
kernel32: Die Bibliothek, also die DLL-Datei, in der die Funktion zu finden ist.
GetDriveTypeA: Der Aliasname, unter dem die Funktion in der Datei "kernel32" gespeichert ist.
nDrive: Der Parameter, der an die Funktion übergeben wird. In diesem Fall ist es nur ein Parameter. Die Variable ist vom Typ String. Sie steht für Buchstaben des Laufwerks, das Sie überprüfen wollen. Ein Beispiel : "C:".
Long: Der Datentyp des Wertes, den die Funktion zurückliefert.

Wenn Sie die Funktion nutzen, müssen Sie eine Variable mit dem richtigen Datentyp definieren, um den Rückgabewert der Funktion speichern zu können. Nach der Deklaration der API-Funktion könnten Sie sie zum Beispiel so aufrufen:

DriveType = GetDriveType("C:")

Datentypen

Windows benötigt innerhalb der Declare-Anweisung für die Argumente der Funktion ganz bestimmte Datentypen. Die folgende Tabelle gibt einen Überblick über die vier wichtigsten Datentyp-Definitionen sowie über die Äquivalente in Pascal und C/C++. Diese Definitionen gelten auch für die Rückgabewerte von API-Funktionen.

DatentypDefinitionBedeutungPascalC/C++
ZeichenketteVarName As String oder VarName$ZeichenkettenpChar*Char, lpString
IntegerVarName As IntegerVorzeichenlose und -behaftete Ganzzahlen mit 16 Bit DatenbreiteInteger, WordInt, UInt
Long IntegerVarName As LongVorzeichenlose und -behaftete Ganzzahlenmit 32 Bit DatenbreiteLongInt
DoubleVarName As DoubleGleitkommazahlen in doppelter GenauigkeitReal, DoubleDouble

Handles, Zeiger und Null-Strings

Windows benutzt numerische Werte, um bestimmte Objekte wie Fenster oder Dialogelemente zu identifizieren. Zwei Arten von numerischen Werten dieser Art gibt es: Handles und Zeiger.

Ein Handle ist ein "Griff" oder "Henkel", um Fenster, Schriften oder Dateien während der Programmierung "anzufassen". Eine ganze Reihe von API-Funktionen arbeiten mit Handles. Ein Handle ist immer ein numerischer Wert des Datentyps Long.

Ein Zeiger verweist auf eine bestimmte Position im Arbeitsspeicher. Dort kann sich zum Beispiel eine Zeichenkette (String) befinden. An der Position, auf die der Zeiger verweist, steht dann das erste Zeichen dieser Zeichenkette. Die Länge der Zeichenkette ist dabei unwichtig. Sie muss nicht bekannt sein. Ihr Ende wird durch ein sogenanntes Null-Zeichen markiert. Die Arbeit mit Zeigern ist in der Programmierung unter Windows sehr häufig. Visual Basic dagegen kennt keinen eigenen Datentyp für einen Zeiger. Statt dessen müssen Sie den Datentyp Long benutzen.

Ein Null-Zeichen ist nicht einfach das Zeichen "0". Beim PC ist jedes Zeichen – also Buchstaben, Ziffern, Satz- und Sonderzeichen – mit einem bestimmten Zeichenwert kodiert. Das Zeichen "0" hat nicht den Wert 0, sondern 48. Mit Null-Zeichen dagegen ist ein Zeichen gemeint, das tatsächlich den Wert 0 hat. Unter Visual Basic weisen Sie zum Beispiel einer Zeichenvariablen a$ den Wert 0 folgendermaßen zu:

a$ = Chr$(0)

Visual Basic besitzt sogar eine eingebaute Konstante für diesen Wert, die den gleichen Zweck erfüllt. Sie können auch schreiben:

a$ = vbNullChar

Zeichenketten

Die API-Funktionen haben ihre ganz eigene Art, mit Zeichenketten umzugehen. Drei Dinge müssen Sie beachten:

Variablen mit "ByVal" übergeben
Sie müssen immer das Schlüsselwort "ByVal" in der Deklaration angeben, obwohl Zeichenketten als Referenzparameter übergeben werden. Das liegt daran, dass Zeichenketten bei API-Funktionen intern als Zeiger behandelt werden. Normalerweise müssen Sie sich nicht um Zeiger kümmern. Doch eine Reihe von API-Funktionen (zum Beispiel "WriteProfileString" oder "GetProfileString") verhalten sich anders, wenn Sie ihnen einen Null-Zeiger übergeben. Einen Null-Zeiger können Sie ganz einfach an Windows übergeben: Sie benutzen wieder die vordefinierte Konstante vbNullString. Diese Konstante übergibt nicht einfach eine leere Zeichenkette an die Funktion, sondern einen "leeren" Zeiger, der auch als Long-Wert 0 ausgedrückt werden könnte. Ein solcher Null-Zeiger enthält keine Daten, das heißt er zeigt auf nichts und weist Windows an, das entsprechende Argument zu ignorieren.

Die Größe des reservierten Speichers
Sie benötigen zusätzlich eine Angabe über die Größe des reservierten Speicherbereichs. Der Puffer muss so groß sein, wie die Größenangabe vorsieht. Aus diesem Grunde sollten Sie mit Hilfe der Funktion String$() eine Zeichenkette in der richtigen Größe erzeugen und – sehr wichtig! – mit Null-Zeichen füllen. Wenn die von der Funktion erzeugte Zeichenkette länger ist, werden nur die Zeichen im Puffer abgelegt, die auch hineinpassen. Das Prinzip eines Aufrufes dieser Art sieht in Basic so aus:

sLen = 30
Buffer = String$(sLen, 0)
Result = TheAPIFunction(Buffer, sLen)

Null-terminierte String verwenden
Windows erwartet keine Basic-Strings, sondern nullterminierte Strings (siehe vorhergehende Seite "Handles, Zeiger und Null-Strings"). Der Vorteil dabei ist die Flexibilität: Dank der Speicherverwaltung von Windows können nullterminierte Strings im Prinzip beliebig lang werden. Leider verwaltet Visual Basic Strings intern vollkommen anders. In einigen Fällen können Sie VB-Strings analog zu nullterminierten Strings nutzen. Doch meistens müssen Sie Vorbereitungen treffen und zum Beispiel den String mit Null-Zeichen initialisieren (siehe oben) oder mit vbNullChar explizit ein Null-Zeichen an seinem Ende anfügen:

VBStr = "Hallo Windows!"
WinStr = VbStr + vbNullChar

Aliasnamen für API-Funktionen

In einigen Fällen wird es nötig sein, API-Funktionen umzubenennen, so dass Sie sie mit einem anderen Namen aufrufen können. Das Technik ist in verschiedenen Situationen hilfreich:

  • Sie wollen eine API-Funktion nutzen, deren Originalname bereits von einer VB-Funktion benutzt wird – zum Beispiel die in Visual Basic schon eingebaute Funktion GetPrivateProfileString.
  • Sie wollen eine API-Funktion nutzen, deren Originalname in VB/VBA illegal ist, zum Beispiel die Funktion _lopen mit Unterstrich.
  • Sie wollen Fehlermeldungen vermeiden, wenn eine Bibliothek bereits die API-Funktion benutzt, so dass Sie sie nicht ein weiteres Mal deklarieren können.
  • Eine Reihe von Funktionen sind mit dem Suffix "A" gekennzeichnet. Sie müssen dies mit dem Alias-Befehl explizit angeben, obwohl die Win32-Dokumentation diese Suffixe nicht angibt.

Zum Hintergrund: Sehr viele Funktionen, die Zeichenketten verarbeiten oder zurückgeben, sind in den beiden Varianten FunctionA und FunctionW vorhanden. Die A-Variante einer Funktion nutzt den "klassischen" ANSI-Zeichensatz (wie unter Windows 3.x), bei dem ein Zeichen in einem Byte kodiert wird. Die W-Varianten nutzen dagegen den Unicode-Zeichensatz, bei dem ein Zeichen in zwei Bytes (einem "Word") kodiert wird. Die Unicode-Unterstützung ist in Windows 95 zwar nicht vollständig verwirklicht, die API-Funktionen sind jedoch bereits dafür vorbereitet.

Um eine API-Funktion mit einem Aliasnamen auszustatten, müssen Sie folgendes Deklarations-Schema benutzen:

Declare Function NeuerName Lib "NameDerDLL" _
  Alias "OriginalName" ( _
  Argumentliste)

Übergabe der Argumente an eine Windows-API-Funktion

VB und VBA übergeben Argumente in aller Regel als Referenzparameter. Das heißt: Sie können die Variable einfach mit dem Namen und dem Datentyp deklarieren.

Bei Windows API-Funktionen ist jedoch oft eine Übergabe als Wertparameter notwendig. Dies gilt vor allem für API-Funktionen, die Zeiger und Zeichenketten als Argument enthalten. Hier müssen Sie die Argumente mit dem Schlüsselwort ByVal kennzeichnen.

Ein Beispiel dafür ist die Funktion lstrcat. Mit ihr können Sie eine Zeichenkette an eine andere anhängen. Wenn Sie die Funktion wie folgt deklarieren

Declare Function lstrcat Lib "kernel32" _
  Alias "lstrcatA" ( _
  lpString1 As String, _
  lpString2 As String) As Long

erzeugt das entsprechende VB/VBA-Programm einen Laufzeitfehler. Richtig ist vielmehr die folgende Deklaration:

Declare Function lstrcat Lib "kernel32" _
  Alias "lstrcatA" ( _
  ByVal lpString1 As String, _
  ByVal lpString2 As String) As Long

Mit diesem Know-how sollten Sie gerüstet sein, die Funktionen der Win-API zu nutzen. Damit stehen Ihnen weit mehr Windowsfunktionen zur Verfügung, als bei reinem Visual Basic. Professionelle Anwendungen sind somit auch mit diesem Entwicklungssystem kein Problem mehr.

Tools und Informationen zum Thema im Internet

Es ist nicht ganz einfach, eine korrekte API-Deklaration aus der Dokumentation des Windows-Entwicklungspakets aufzustellen. Aus diesem Grunde bietet Microsoft in der Developer-Version von Office 97/2000 mit der Datei "winapi.txt" eine Übersicht mit den Deklarationen aller wichtigen Konstanten, Strukturen und Funktionen an. Sie ist auch im Internet als  Download in Form eines selbstentpackenden Archivs erhältlich.

Eine ausführliche (englischsprachige) Referenz der Win-API mit Deklarationen für VB und VBA stellt der  "Windows API Guide" zur Verfügung.

Hilfreich ist auch die kostenlose Software "Win32 API Tutor for Visual Basic". Das Programm ist beispielsweise beim Shareware-Angebot Winfiles.com in der Rubrik  "Windows 95/98 Visual Basic Tools" erhältlich.

Dieser Workshop wurde bereits 19.015 mal aufgerufen.

Über diesen Workshop im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Workshop, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2017 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel