Verfasst: 14. April 96
Autorin: Dr. Silvia Rothen, rothen ecotronics, Bern, Schweiz
Letzte Überarbeitung: 13.05.18
Einleitung
Delphi-DLL
Einbindung einer DLL in Authorware
Tips und Tricks
Literatur
Adressen
Authorware ist wie das bekanntere Toolbook ein visuelles Autorentool zur
Erstellung von anspruchsvollen Multimediaproduktionen oder CBT-Anwendungen
(Computer Based Training). Gegenüber Toolbook hat es den Vorteil, dass Cross-Plattform-Anwendungen
für PC und Mac erstellt werden können, was sich der Hersteller Macromedia
(Adresse siehe unten) mit einem äusserst stolzen Preis bezahlen lässt.
Da Authorware fast ausschliesslich mit visuellen Elementen, den Icons, arbeitet, sind die
Möglichkeiten der Programmierung verglichen mit einer Entwicklungsumgebung wie Delphi
oder Visual Basic ziemlich beschränkt. Da Programmcode mittels sogenannten
Calculation-Icons an den verschiedensten Stellen der Flowline eingefügt wird, verliert
man ausserdem rasch den Überblick. Glücklicherweise bietet Authorware die Möglichkeit,
statt Authorware-Code zu schreiben, Funktionen aus externen DLLs zu verwenden.
Einerseits können damit bestehende DLLs angezapft werden, falls man deren innere Struktur
kennt (was leider oft nicht der Fall ist). Oft ist es sinnvoll, für diesen Zweck eine eigene
DLL zu schreiben, beispielsweise mit Borlands Entwicklungsumgebung Delphi
(Adresse siehe unten).
Der erste Teil des folgenden Textes zeigt, wie man ein Delphi-Projekt in eine DLL
umwandelt. Im zweiten Teil zeige ich dann, wie die Funktionen der Delphi-DLL anschliessend
in Authorware eingebunden werden. Als Beispiel dient ein kleines Delphiformular, mit dem
nach dem Passwort gefragt wird.
Die folgenden Konventionen bezüglich der Formatierung gelten für dieses und das
nächste Kapitel:
Um ein normales Delphiprojekt in eine DLL umzuwandeln braucht es die folgenden 5
Änderungen in Projektdatei (dpr) und units (eine ausführliche Beschreibung findet sich
im Handbuch Komponentenentwicklung, Delphi 1995, Seite 145 bis 149).
In der Projektdatei
Für unser Beispiel, bei dem als einzige Funktion GetPasswort exportiert wird, sieht der
Code der Projektdatei folgendermassen aus:
library Pwenter; uses Pwform in 'PWFORM.PAS' {Eingabeform}; exports GetPassword; {$R *.RES} begin end.
In den Units:
Im Interface-Teil der unit wird der Funktionskopf der zu exportierenden
Funktion eingefügt und nach dem Strichpunkt mit dem Wort export; ergänzt.
Bei den Funktionen muss man darauf achten, dass die Typen auf die Anwendung abgestimmt
werden, mit der man die DLL aufrufen will. Der Type string ist beispielsweise spezifisch
für Delphi und Pascal. Für andere Anwendungen wie Authorware oder C benutzt man deshalb
stattdessen den Type PChar. Mehr zur Verträglichkeit von Authorware und Delphitypen
findet sich im Abschnitt Typen
Der Code für unser Beispiel sieht so aus:
unit Pwform; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus; type TEingabeform = class(TForm) .... end; var Eingabeform: TEingabeform; function GetPassword(AName : PChar) : wordbool; export; implementation {$R *.DFM} function GetPassword(AName : PChar) : wordbool; begin ....... end; end.
Nach diesen Änderungen wird bei der nächsten Compilierung automatisch die DLL
"pwenter.dll" erzeugt.
Um Funktionen aus der DLL von Hand zu laden, geht man folgendermassen vor:
Im Screenshot sieht man die korrekt ausgefüllte Maske für unsere Beispielfunktion
GetPassword
Wird die Funktion erfolgreich geladen, dann kann sie anschliessend wie eine interne
Funktion mit Data - Show Functions wie im Bild ersichtlich in calculation icons
hineingepastet werden.
In unserem Beispiel könnte der entsprechende Authorware-Code etwa so aussehen:
vresult := getpassword("versuch") if vresult then DisplayIcon(IconID@"Richtig") else DisplayIcon(IconID@"Falsch") end if
Damit das manuelle Laden von Funktionenauch klappt, muss man wissen, welche
Delphi-Typen den Authorware- Typen entsprechen. Die folgende, nicht vollständige Tabelle
listet dies für einige Typen auf:
Authorware | Delphi | Windows API |
---|---|---|
byte | byte | BYTE |
char | char | - |
double | vmtl. double | - |
dword | - | DWORD |
float | vmtl. real | - |
long | longint | LONG |
pointer | ? | LPRECT, LPPOINT |
short | integer, wordbool | BOOL |
string | PChar, PStr | LPCSTR, LPSTR |
void | ? | ? |
word | word | UINT, WORD |
word | THandle | HWND |
Wenn man gezwungen ist, möglichst platzsparend zu programmieren, beispielsweise weil
die Endanwendung auf wenigen Disketten Platz haben muss, dann müssen alle externen
Funktionen in eine einzige DLL gepackt werden. Jede Delphi-DLL belegt nämlich mindestens
100 KB. Kompressionsprogramme wie pkzip reduzieren dies um höchstens die Hälfte,
während sich Authorware-Code, solange keine Grafiken enthalten sind, oft um über 80 %
reduzieren lässt.
Um das Laden von Funktionen aus externen DLLs in Authorware-Projekte zu automatisieren,
kann man UCDs (User Code Documents) dazwischenschalten. Nach dem Laden einer UCD lassen
sich die darin enthaltenen Funktionen wie authorwareeigene Funktionen verwende. Im
Handbuch "Using Authorware" findet sich eine Beschreibung auf Seite 610, und auf
den Seiten 617 bis 622.
Leider beziehen sich alle Informationen, die ich bisher über die Erstellung von UCDs
gefunden habe, auf die Sprache C++, die mir nicht zur Verfügung steht. Für alle
Hinweise, ob es möglich ist, UCDs in Delphi zu erstellen und zu kompilieren, und wie man
dabei vorgeht, bin ich deshalb äusserst dankbar (rothen_s@bluewin.ch)
Delphi 1995: Handbuch Komponentenentwicklung. Borland Delphi für Windows.
Version 1.0, Borland International, Scotts Valley, CA (Teil der offiziellen
Handbücher)
Macromedia 1995: Using Authorware. Version 3, Macromedia Inc., San
Francisco, CA (Teil der offiziellen Handbücher)
Macromedia: http://www.macromedia.com
Borland: http://www.borland.com
Diese Webseite wurde am 21.05.18 um 17:10 von rothen ecotronics erstellt oder überarbeitet.
Printed on 100% recycled electrons!