IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Visual Basic - Win32-API-Programmierung in VB



Win32-API-Programmierung in VB

Mit dem Win32 API lassen sich alle Möglichkeiten der Programmierung unter Windows ausschöpfen, da dieses eine Schnittstelle zum Betriebssystem darstellt. Dieser Artikel zeigt, wie Sie mit Visual Basic Zugriff auf die zusätzlichen Funktionen erhalten.


Autor: Tobias Surmann (incsoft)
Datum: 05-04-2003, 15:42:34
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 13959x
Rating: 5.5 (2x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einleitung

Visual Basic ist eine Programmiersprache, die zwar alle wichtigen Funktionen für die Programmierung von Windows-Anwendungen zur Verfügung stellt, allerdings gibt es noch viel mehr Möglichkeiten und Funktionen unter Windows. Mit dem Win32 API lassen sich alle Möglichkeiten der Programmierung unter Windows ausschöpfen, da dieses eine Schnittstelle zum Betriebssystem darstellt. Das heißt, dass alle Funktionen, die man unter Windows ausführen kann, über die Win32-API-Schnittstelle auch von einem VB-Programm genutzt werden können, denn Visual Basic hat glücklicherweise die Fähigkeit externe Routinen benutzen zu können. Solche externen Routinen sind in DLL-Dateien (Dynamic Link Library) zusammengefasst. Da das Win32 API als ein Satz von DLLs mit jeder Menge Unterroutinen implementiert ist, können wir von VB aus darauf zugreifen und Win32-API-Aufrufe für unsere Programme nutzen.

Zeichensätze

Im Win32 API gibt es grundsätzlich 3 verschiedene Zeichensätze:
  • ANSI (häufig auch als ASCII bezeichnet) - jedes Zeichen beansprucht 1 Byte
  • DBCS (Double Byte Character Set) - bestimmte Zeichen werden als Indikator für das nächste Byte bei der Zeichenbildung verwendet
  • Unicode - jedes Zeichen benötigt 2 Bytes
DBCS und Unicode sind wichtig für die Programmierung internationaler Anwendungen. Die Win32-API-Funktionen müssen wissen, mit welchem Zeichensatz sie arbeiten. Das Problem dabei ist die Prüfung auf den Unterschied zwischen ANSI und Unicode. Deshalb gibt es jede Funktion des Win32 APIs in zweifacher Ausführung, einmal mit Unicode und einmal mit ANSI-Parametern. Der Name der API-Funktion bleibt dabei gleich, allerdings wird bei ANSI ein A an den Namen angehängt (was man sehr häufig sieht) und die Unicode-Version erhält ein W. Ein Beispiel dafür ist die allgemeine API-Funktion MessageBox, die es für Unicode als MessageBoxW und für ANSI als MessageBoxA gibt.

Deklaration einer Win32-API-Funktion

Allgemein ist eine Deklaration von Win32-API-Funktion wie folgt aufgebaut.

Prozeduren:

[Public | Private] Declare Sub Name Lib "BibName" [Alias "Aliasname"] [([ArgListe])]


Funktionen:

[Public | Private] Declare Function Name Lib "BibName" [Alias "Aliasname"] [([ArgListe])] [As Typ]


Das Schlüsselwort in Visual Basic für den Zugriff auf externe Routinen in DLLs heißt Declare. Zerlegen wir die allgemeine Schreibweise in kleinere Abschnitte.
  • Das Schlüsselwort Public ist optional und deklariert Prozeduren bzw. Funktionen, die in jedem anderem Modul sichtbar und verfügbar sind. Mit Private deklarierte Funktionen sind hingegen nur auf Modulebene verwendbar.
  • Das Schlüsselwort Sub wird für Prozeduren verwendet, gibt die aufgerufene Routine einen Wert zurück, so handelt es sich um eine Funktion, welche mit dem Schlüsselwort Function deklariert wird.
  • Der Name der aufzurufenden Funktion muss unbedingt angegeben werden. Bitte beachten Sie, dass bei diesen Namen die Groß-/Kleinschreibung unterschieden wird.
  • Die deklarierte Prozedur ist bei Zugriff auf das Win32 API in einer DLL oder Code-Ressource enthalten. Der Lib-Abschnitt ist daher bei allen Deklarationen erforderlich.
  • BibName enthält den Namen der DLL in der die zu deklarierende Funktion enthalten ist. Die Erweiterung .dll ist nur erforderlich, falls es sich nicht um eine der drei Hauptbibliotheken von Windows handelt (user32.dll, kernel32.dll und gdi32.dll).
  • Alias gibt an, dass die aufzurufende Prozedur in der DLL einen anderen Namen hat. Dies ist sinnvoll, wenn der Name einer externen Prozedur einem Schlüsselwort entspricht. Alias kann auch verwendet werden, wenn eine DLL-Prozedur denselben Namen hat wie eine öffentliche Variable oder eine andere Prozedur mit demselben Gültigkeitsbereich. Alias bietet sich darüber hinaus an, wenn bestimmte Zeichen im Namen der DLL-Prozedur aufgrund der Namenskonvention für DLLs nicht zulässig sind. Somit ist der Aliasname der echt Name, so wie er in DLL definiert ist. Hier muss man also besonders auf die verschiedenen Zeichensätze achten. Ist kein Alias angegeben, so wird der Wert von Name angenommen.
  • ArgListe ist eine Liste von Parametern, die an die externe Funktion übergeben werden. Sie ist genauso aufgebaut wie bei einer "normalen" Visual Basic Funktion.
  • As Typ wird nur verwendet, wenn die aufzurufende Routine einen Rückgabewert hat, d.h. wenn es sich um eine Funktion handelt. Hier kann der Rückgabetyp der Funktion festgelegt werden.
Aufruf einer Win32-API-Funktion im Quellcode

Der Aufruf einer Win32-API-Funktion gestaltet sich sehr einfach, da sie wie eine ganz normale Visual Basic "interne" Funktion aufgerufen werden kann. Sie brauchen in ihrem Quellcode also nur die entsprechende Funktion mit den dazugehörigen Parametern in eine Anweisung oder Zuweisung einbauen, Visual Basic erledigt den Rest und man braucht sich nicht weiter um den Zugriff auf die externe DLL kümmern.

Beispiel

Zuletzt möchte ich Ihnen zwei einfache Beispiele vorstellen. Zuerst möchten wir gerne einen Ton beliebiger Länge und Frequenz ausgeben. Die Funktion Beep, die uns Visual Basic zur Verfügung stellt, gibt zwar einen Ton aus, allerdings können wir hier Länge und Frequenz nicht selbst bestimmen. Deshalb greifen wir auf die Win32 API zurück. In den allgemeinen Deklarationsabschnitt muss folgende Deklaration eingefügt werden.

Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long


Die Funktion soll nur auf Modulebene verfügbar sein. Über die Parameter dwFreq und dwDuration können wir nun die Frequenz und Dauer des Tons beliebig wählen. Ein möglicher Funktionsaufruf könnte wie folgt aussehen:

Beep 100, 200


Zugegeben, das ist eine sehr einfach zu benutzende Funktion. Sehen wir uns zum Schluss noch eine kompliziertere API-Funktion an.

Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long


Diese Funktion hat einen Gültigkeitsbereich, der über Modulebene hinaus geht. Sie können Sie also in jedem anderen Modul verwenden. Hier wird auch sichtbar, dass die Funktion mit dem ANSI-Zeichensatz arbeitet, das können wir an dem Anhängsel A im Abschnitt Alias sehen. In unserem Programm können wir die Funktion aber unter dem Namen MessageBox benutzen. Abschließend fällt auf, dass wir im Abschnitt Lib keine Extension für die user32.dll angeben zu brauchen. Diese DLL gehört - genau wie kernel32.dll und gdi32.dll - zur Hauptbibliothek der Win32 API.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04510
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06247
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1158
Comments: 0