Hauptseite >Tips zu VB5/6 > VB mit PowerBASIC erweitern | |
VB schirmt uns von vielen systemnahen und damit "gefährlichen" Operationen ab. Daraus resultiert die
hohe Produktivität der Arbeit mit dieser Sprache. Beispielsweise ist es mit reinem VB nahezu unmöglich,
Pufferüberläufe oder "Memory Leaks" zu produzieren oder gar zu ungültigen Speicheradressen zu springen.
Damit ist die Sprache das optimale RAD-Tool,
obwohl sie ihre Vergangenheit als Interpreter-Sprache längst hinter sich hat und seit Version 5
echten Maschinencode erzeugt.
Aber alles hat seinen Preis. Die hohe Sicherheit bei gleichzeitig hoher Produktivität wird erkauft durch den Verzicht auf Zeigeroperationen, Aufrufe von Funktions-Adressen, Inline-Assembler und dergleichen mehr - diese Dinge sind in VB nicht oder nur sehr eingeschränkt möglich. Das ist in aller Regel nicht weiter schlimm, in der Praxis werden Sie so etwas nur sehr selten benötigen. Aber manchmal kommt man eben doch in die Situation. Die Lösung besteht dann darin, in einer anderen Sprache eine Standard-DLL zu schreiben, in der Sie das betreffende Problem lösen. Diese DLL können Sie dann problemlos von VB aus aufrufen, sofern die DLL ihre Funktionen nach der StdCall-Aufrufkonvention exportiert. Beim Stichwort "andere Sprache" werden nun die meisten gleich an den "Alleskönner" C/C++ denken, aber hier ist die gute Nachricht: es gibt durchaus BASIC-Dialekte, die dafür ebenfalls bestens geeignet sind. Der Compiler der Firma PowerBASIC Inc. ist eine hocheffiziente und sehr flexibel einsetzbare Weiterentwicklung des alten TurboBASIC. Mit ihm lassen sich native Windows-DLLs, Windows-GUI- und Windows-Konsolen-Anwendungen erzeugen, die von keinerlei Laufzeit-Komponenten abhängig sind. Mit Zeiger-Arithmetik, Aufruf von Funktions-Adressen (CALL DWORD) bis hin zu Inline-Assembler für besonders zeitkritische Routinen bietet die Sprache alles, was man für systemnahe Zugriffe benötigt. Und: die Zusammenarbeit mit VB ist völlig unproblematisch. Die grösste Hürde am Anfang besteht darin, zu wissen, wie Funktionsdeklarationen auf beiden Seiten aussehen müssen, damit VB und PB miteinander kommunizieren können; daher soll im Folgenden mit ein paar einfachen Beispielen gezeigt werden, wie es funktioniert. Um den PB-Code übersetzen zu können, benötigen Sie den Compiler PowerBASIC für Windows (Version 7 oder höher, Bezug in Deutschland über diese Adresse), der Preis ist mit derzeit 149,00 € (Stand Sept. 2008) angesichts des Funktionsumfangs geradezu ein Schnäppchen. PowerBASIC-Code:
Und hier der VB-Code:
Wie Sie sehen, machen die Funktionen nichts Besonderes, das in VB nicht auch zu bewerkstelligen wäre (von SHR() und GetInstalledRamSize() mal abgesehen), und nutzen die Möglichkeiten von PB bei Weitem nicht aus. Die Beispiele zeigen lediglich, wie die grundlegenden Datentypen zwischen VB und PB hin- und hergereicht werden. Wenn Sie erst einmal gesehen haben, wie einfach das geht, werden Sie sicher bald von ganz alleine neugierig, wie Sie Ihre VB-Programme mit Hilfe von PowerBASIC erweitern können, und vielfältige Möglichkeiten entdecken. Für mich fängt das schon damit an, dass ich grundlegende Funktionalitäten, die ihre Stabilität längst bewiesen haben, gerne in eine DLL auslagere, damit sie mich beim Debuggen nicht weiter stören, wenn ich mal wieder vergessen habe, die Shift- zusammen mit der F8-Taste zu drücken. Weitere Einsatzbereiche sind die oben erwähnten Situationen, in denen es die Sicherheitsmechanismen von VB schwer oder unmöglich machen, bestimmte Funktionen auszuführen. Dazu gehört auch der Aufruf von Funktionen in DLLs, die eine andere als die StdCall-Aufrufkonvention voraussetzen. Auch bei sehr zeitkritischen Routinen kommt eine Auslagerung in Betracht, da man in PB vielfältige Optimierungsmöglichkeiten hat. Beachten Sie jedoch, dass VB bei der Übergabe von String-Parametern an eine native Windows-DLL den Unicode-String (2 Byte pro Zeichen) erst in einen ANSI-String (1 Byte pro Zeichen) umwandelt, was natürlich etwas Zeit kostet; das oben gezeigte UpperCase-Beispiel brächte also sicherlich keinen Performance-Vorteil, da der übergebene String in der DLL nicht sonderlich intensiv bearbeitet wird. Last but not least bietet PB umfangreiche Unterstützung für Threading, so dass Sie auch dieses Feature in Ihren VB-Programmen nutzen können - ohne dass Sie auf ActiveX-Programme angewiesen sind, die auf dem Zielsystem registriert sein müssen. Das obige Beispiel zeigt, wie man mit PowerBASIC native Windows-DLLs erzeugt - das sind diejenigen, die Sie in VB über Declare-Statements nutzbar machen und die nicht registriert sein müssen (und auch nicht sein können). Mit VB können Sie solche DLLs nicht erzeugen. Daneben gibt es noch COM-DLLs, aus denen Sie im Normalfall Instanzen von COM-Klassen erzeugen können, wenn Sie in Ihrem VB-Projekt einen Verweis auf die betreffende Bibliothek gesetzt haben - dazu muss die DLL allerdings registriert sein. Solche (und nur solche) DLLs können mit VB erzeugt werden. Seit Version 9.0 kann PowerBASIC ebenfalls COM-DLLs erzeugen, wobei diese DLLs gleichzeitig nativ Funktionen exportieren können. Somit können Sie aus PB-DLLs COM-Objekte erzeugen, ohne dass die DLL registriert sein muss. Wie dies geht, werde ich demnächst in einem weiteren Artikel zeigen. Abschliessend noch der Hinweis: Mit PowerBASIC verlassen wir in vielerlei Hinsicht die "schützende Hülle" von VB; Sie sollten ihren PB-Code daher besonders ausführlich testen. |
|
Hauptseite > Tips zu VB5/6 > diese Seite | |
© 2001-2021 Wolfgang Enzinger |