Einbindung von Ressourcen
von Herfried K. Wagner
Übersicht
Ressourcendateien werden vor allem bei grösseren Projekten, die in mehreren verschiedenen Sprachversionen erscheinen, verwendet. Der Hauptvorteil von Ressourcendateien liegt darin, dass z.B. sprachspezifische Elemente (Beschriftungen und Grafiken) nicht im Programmcode, sondern in der Ressourcendatei abgelegt werden. Dadurch reicht es beispielsweise, eine Ressourcendatei mit den Ressourcen einer anderen Sprache mit dem Projekt zu verknüpfen und im kompilierten Programm werden automatisch alle Beschriftungen der Sprache angepasst.
Mit freundlichen Grüßen
Herfried K. Wagner Hirf@activevb.de
Inhalt
Wozu Ressourcen einbinden?
Die Hauptverwendungszwecke von Ressourcendateien sind:
- Erleichterung der Erstellung und Verwaltung internationaler Anwendungen durch das Laden von Texten und Grafiken aus der Ressourcendatei.
- Einbinden externer Dateien wie z.B. JPEGs, DLLs, Wave-Dateien, Animationen und Textdateien in die .exe
- Speichercontainer für Grafik- und Textdaten, die zur Zeit nicht auf den Formularen angezeigt werden. Es könnten beispielsweise die Beschriftungen für mehrere Sprachen über eine Ressourcendatei eingebunden werden und je nach Systemsprache die entsprechenden Beschriftungen geladen werden.
Erstellen von Ressourcendateien, Dateinamenserweiterungen
Ressourcendateien wurden nicht speziell für Visual Basic entwickelt, sie werden auch in anderen Win32-Programmiersprachen wie z.B. Microsoft Visual C++ verwendet. Im Gegensatz zu Visual C++ unterstützt Visual Basic nur einen kleinen Teil der Funktionen von Ressourcendateien, es können aber über das Win32-API auch Ressourcentypen, die nur anderen Programmiersprachen vorbehalten sind, verwendet werden.
Ressourcendateien können Daten in folgenden Formaten enthalten (die Liste ist unvollständig):
Typ | Beschreibung |
---|---|
Accelerator | Zugriffstastentabellen |
Bitmap | Bitmap-Grafiken aller Farbtiefen, keine JPEGs, GIFs etc. |
Cursor | Cursor-Dateien |
Dialog* | Verschiedene Dialoge |
HTML* | HTML-Dokumente |
Icon | Icon-Dateien |
Menu* | Menüs |
String Table | Texttabellen |
Toolbar* | Werkzeugleisten |
Version* | Versionsinformation |
Custom | Benutzerdefinierte Datentypen z.B. "CUSTOM" oder "WAVE" |
Tabelle 1 : Auflistung der verschiedenen Resourcentypen
Die mit * gekennzeichneten Typen werden von Visual Basic nicht unterstützt.
Ressourcenscripts können in einem Texteditor wie z.B. Notepad geschrieben werden, allerdings können sie auch mit Visual C++ bequem erstellt und modifiziert werden. Zum Kompilieren dieser Ressourcenscripts wird ein Ressourcen-Compiler verwendet. Unter Visual C++ können Ressourcenscripts kompiliert werden, auf der Visual Basic CD-ROM ist der Windows NT-Ressourcen-Compilier rc.exe (Befehlszeile) enthalten.
Extension | Dateityp | Beschreibung |
---|---|---|
.rc | Ressourcenscript | Enthält Anweisungen, anhand derer ein Ressourcen-Compiler die Daten lokalisiert, die einkompiliert werden sollen. Es sind Verweise zu externen Dateien und/oder Tabellen für bestimmte Ressourcentypen enthalten, es können auch die Daten direkt im Ressourcenscript abgelegt sein. |
.res | Comp. Ressource | Diese Dateien sind Windows 32-Bit Ressourcendateien. Sie enthalten Daten, die von einer 32-Bit Windows-Anwendung geladen und verwendet werden können. Diese Dateien werden beispielsweise in ein Projekt für eine Anwendung etc. eingebunden und anschliessend direkt in die ausführbare Datei einkompiliert. Daher muss diese Datei nicht mit dem fertigen Projekt ausgeliefert werden. Wenn ein Ressourcenscript (.rc) zu einer Ressourcendatei (.res) kompiliert wurde, dürfen die Dateien, auf die vom Ressourcenscript verwiesen wird, nicht gelöscht werden, da sie beim erneuten Kompilieren des Ressourcenscripts wieder benötigt werden. |
Tabelle 2
Unter Microsoft Visual Basic 6.0 ist ein Ressourceneditor als Add-In verfügbar, er kann über den Dialog zum Hinzufügen von Add-Ins geladen/entladen werden. Dieser Editor wurde speziell auf die von VB unterstützten Ressourcentypen ausgelegt. Dieses Add-In erstellt kein Ressourcenscript sondern schreibt direkt die Ressourcendatei.
Wenn von einem Ressourcen-Projekt nur mehr die kompilierte Ressourcendatei vorhanden ist, weil das Ressourcenscript und die damit verknüpften Dateien gelöscht wurden, so kann die Ressourcendatei mit Microsoft Visual C++ dekompiliert werden, d.h. es werden die Dateien extrahiert und das Ressourcenscript wiederhergestellt.
Aufbau eines Ressourcenscripts [.rc] und VB
Ladeattribute
Die Ladeattribute geben an, wann eine Ressource geladen werden soll. Als Ladeparameter muss einer der folgenden Parameter verwendet werden:
Parameter | Beschreibung |
---|---|
PRELOAD | Ignoriert. Unter 16-Bit Windows wird die Ressource mit der Anwendungsdatei geladen |
LOADONCALL | Ignoriert, Unter 16-Bit Windows wird die Ressource geladen, wenn sie aufgerufen wird |
Tabelle 3 : Ladeattribute
Speicherattribute
Die Speicherattribute geben an, ob eine Ressource an einer festen Position im Speicher abgelegt ist, beweglich ist oder ob sie geleert werden kann oder ob es sich um eine reine Ressource handelt. Als Speicher-Parameter können einer oder mehrere der folgenden Werte verwendet werden:
Parameter | Beschreibung |
---|---|
FIXED | Ignoriert. Unter 16-Bit Windows bleibt die Ressource an einer bestimmten Speicherposition |
MOVEABLE | Ignoriert. Unter 16-Bit Windows kann die Ressource verschoben werden, um den Speicher zusammenzufassen |
DISCARDABLE | Die Ressource kann geleert werden, wenn sie nicht mehr länger gebraucht wird. |
PURE | Ignoriert. Erwartet für die Kompatibilität mit existierenden Ressourcenscripts |
IMPURE | Ignoriert. Erwartet für die Kompatibilität mit existierenden Ressourcenscripts |
Tabelle 4 : Speicherattribute
Für Cursor, Icons und Schriftartenressourcen ist DISCARDABLE Voreinstellung.
ICON Ressource
nameID ICON [load-mem] filename
Die ICON Ressourcendefinition gibt eine Bitmap (Icon) an, welche in der Anwendung als Icon verwendet werden kann.
Die ICON Ressource mit der niedrigsten Ressourcen-ID wird als Anwendungssymbol verwendet, wenn unter Microsoft Visual Basic ein Formular-Icon als Anwendungssymbol eingestellt wurde, wird dieses nicht verwendet, sondern das Icon aus der Ressourcendatei.
![]() | ![]() ![]() ![]() ![]() ![]() ![]() |
Anwend.Symb. der winpopup.exe | Icon mit der niedrigsten Ressourcen-ID in der iexplore.exe |
Icons können Bilder für mehrere Grössen und Auflösungen enthalten. Es wird empfohlen, als Anwendungssymbol ein Icon zu verwenden, dass, wie die iexplore.exe, Bilder für die Grössen 16 x 16 Pixel (small), 32 x 32 Pixel (normal) und 48 x 48 Pixel (large) in 16 und 256 Farben enthält.
Parameter
Parameter | Beschreibung |
---|---|
nameID | Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, der die Ressource definiert. |
load-mem | Gibt Lade- und Speicherattribute der Ressource an. |
filename | Gibt den Dateinamen der Datei an, die die Ressource enthält. Der Name muss ein gültiger Dateiname sein, der gesamte Pfad, wenn die Datei sich nicht im Arbeitsverzeichnis befindet. Der Pfad kann in Anführungszeichen gesetzt werden oder nicht. |
Tabelle 5
Icon- und Cursorressourcen können mehr als ein Bild enthalten. Wenn die Ressource als PRELOAD markiert ist, lädt Windows alle Bilder in der Ressource, wenn die Anwendung ausgeführt wird.
Das folgende Beispiel gibt 2 Icon-Ressourcen an:
desk1 ICON desk.ico 11 ICON DISCARDABLE custom.ico
MENU Ressource
menuID MENU [load-mem] [optional-statements] BEGIN item-definitions ... END
Die MENU Ressourcendefinition gibt den Inhalt einer Menü-Ressource an, Ein Menü ist eine Sammlung von Informationen, die das Aussehen und die Funktion des Anwendungsmenüs bestimmen. Ein Menü ist ein spezielles Eingabewerkzeug, das dem Benutzer erlaubt, Befehle aus einer Liste von Befehlsnamen zu wählen.
Abbildung 1: Beispiel für ein typisches Win32-Menü
Parameter
Parameter | Beschreibung |
---|---|
menuID | Identifiziert das Menü. Dieser Wert ist entweder ein eindeutiger Name oder eine 16-Bit Ganzzahl (Integer) im Bereich von 1 bis 65535 |
load-mem | Gibt Lade- und Speicherattribute der Ressource an. |
optional-statements | Keines oder mehrere der in der folgenden Tabelle aufgeführten Anweisungen |
Tabelle 6
Anweisungen für optional-statements
Anweisung | Datentyp | Beschreibung |
---|---|---|
CHARACTERISTICS | dWord | Benutzerdefinierte Information über eine Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben |
LANGUAGE | lang., sublang. | Gibt die Sprache für die Ressource an. Die Parameter sind Konstanten aus WINNLS.H |
VERSION | dWord | Benutzerdefinierte Versionsnummer der Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben |
Tabelle 7
Das folgende Beispiel zeigt eine komplette MENU Ressourcendefinition:
sample MENU BEGIN MENUITEM "&Soup", 100 MENUITEM "S&alad", 101 POPUP "&Entree" BEGIN MENUITEM "&Fish", 200 MENUITEM "&Chicken", 201, CHECKED POPUP "&Beef" BEGIN MENUITEM "&Steak", 301 MENUITEM "&Prime Rib", 302 END END MENUITEM "&Dessert", 103 END
STRINGTABLE Ressource
STRINGTABLE [load-mem] [optional-statements] BEGIN stringID string ... END
Die MENU Ressourcendefinition gibt eine oder mehrere String-Ressourcen für eine Anwendung an, String-Ressourcen sind nullterminiert. Es handelt sich dabei um eindeutige Strings, die mit der LoadString API-Funktion geladen werden können, wenn sie von der Anwendungsdatei benötigt werden. Unter Visual Basic wird dazu die LoadResString-Funktion verwendet.
Parameter
Parameter | Beschreibung |
---|---|
load-mem | Gibt Lade- und Speicherattribute der Ressource an. |
stringID | Gibt eine 16-Bit Ganzzahl (Integer) an, die die Ressource identifiziert. |
string | Gibt einen oder mehrere Texte an, die zwischen doppelten Anführungszeichen stehen. Der Text darf höchstens 255 Zeichen lang sein und darf nur eine Zeile Code im Ressourcenscript (.rc) ausmachen. Um einen Wagenrücklauf zum Text hinzuzufügen, wird folgende Zeichensequenz verwendet: \012. Beispielsweise, "Line one\012Line two" würde einen Text definieren, der folgendermassen dargestellt wird: Line one Line two |
optional-statements | Keines oder mehrere der in der folgenden Tabelle aufgeführten Anweisungen |
Tabelle 8
Anweisungen für optional-statements
Anweisung | Datentyp | Beschreibung |
---|---|---|
CHARACTERISTICS | dWord | Benutzerdefinierte Information über eine Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben |
LANGUAGE | lang., sublang. | Gibt die Sprache für die Ressource an. Die Parameter sind Konstanten aus WINNLS.H |
VERSION | dWord | Benutzerdefinierte Versionsnummer der Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben |
Tabelle 9
Gruppieren von Texten (Strings) in einer separaten Sektion erlaubt es, alle eingebundenen Texte auf einmal zu lesen und zu leeren. Wenn möglich, sollte eine Anwendung die Tabelle movable und discardable machen. RC (rc.exe) gruppiert 16 Texte pro Sektion und verwendet die Identifikationsnummer um festzustellen, welche Sektion den gewünschten Text enthält. Texte mit den gleichen "oberen"-12 Bits in ihren Identifikationsnummern sind in der selben Sektion plaziert.
Folgendes Beispiel demonstriert die Verwendung der STRINGTABLE-Anweisung:
#define IDS_HELLO 1 #define IDS_GOODBYE 2 STRINGTABLE BEGIN IDS_HELLO, "Hello" IDS_GOODBYE, "Goodbye" END
CUSTOM Ressource
nameID typeID [load-mem] filename
Der Dateiname gibt den Namen einer Datei an, die die Binärdaten der Ressource angibt. Der Inhalt der Datei ist als Ressource enthalten. Der Ressourcen-Compiler RC (rc.exe) interpretiert die binären Daten nicht, daher liegt es in der Verantwortung des Programmierers, dass die Daten optimal für die Architektur des Zielcomputers angepasst sind.
Eine benutzerdefinierte Ressource kann auch vollständig im Ressourcenscript definiert werden, indem folgende Syntax verwendet wird:
nameID typeID [load-mem] BEGIN raw-data END
Eine benutzerdefinierte Ressourcenanweisung gibt eine Ressource an, die anwendungs-spezifische Daten enthält. Die Daten können jedes Format haben und können auch als der Inhalt einer gegebenen Datei definiert werden (wenn der filename-Parameter angegeben wird), oder als eine Serie von Nummern und Texten (Strings) (wenn der raw-data-Block angegeben wurde).
Parameter
Parameter | Beschreibung |
---|---|
load-mem | Gibt Lade- und Speicherattribute der Ressource an. |
nameID | Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, die die Ressource identifiziert |
typeID | Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, die den Ressourcentyp identifiziert. Wenn eine Nummer angegeben wurde muss diese grösser als 255 sein. Die Nummern von 1 bis 255 sind für bereits existierende oder zukünftige Ressourcentypen reserviert |
filename | Gibt den Namen der Datei an, die die Ressourcendaten enthält. Der Name muss ein gültiger Dateiname sein; wenn sich die Datei nicht im Arbeitsverzeichnis befindet, muss der volle Pfad der Datei angegeben werden |
raw-data | Gibt Rohdaten an, die aus einer oder mehreren Ganzzahlen oder Texten aus Zeichen besteht. Ganzzahlen (Integers) können in Dezimal-, Oktal-, oder Hexadezimalformat angegeben werden. Der Ressourcen-Compiler fügt einem String nicht automatisch ein abschliessendes Nullchar hinzu. Der String ist eine Folge von ANSI (Byte) Zeichen, Strings in allen Ressourcen ausser RCDATA und benutzerdefinierten Ressourcen sind Unicode-Strings. Es ist die Aufgabe des Programmierers, die Daten optimal auf die Architektur des Zielcomputers anzupassen. |
Tabelle 10
Folgendes Beispiel zeigt verschiedene benutzerdefinierte Anweisungen:
array MYRES data.res 14 300 custom.res 18 MYRES2BEGIN "Here is a data string\0", /* A string, null-terminated */ 1024, /* int */ 0x029a, /* hex int */ 0o733, /* octal int */ "\07" /* octal byte */ END
CURSOR Ressource
nameID CURSOR [load-mem] filename
Die CURSOR Ressourcendefinition gibt eine Bitmap (Cursor) an, die die Form des Cursors auf dem Bildschirm bestimmt.
Parameter
Parameter | Beschreibung |
---|---|
load-mem | Gibt Lade- und Speicherattribute der Ressource an. |
nameID | Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, die die Ressource identifiziert. |
filename | Gibt den Namen der Datei an, die die Ressource enthält. Der Name muss ein gültiger Dateiname sein; wenn sich die Datei nicht im Arbeitsverzeichnis befindet, muss der volle Pfad der Datei angegeben werden. Der Pfad kann optional zwsichen Anführungszeichen gestellt werden. |
Tabelle 11
Icon- und Cursorressourcen können mehr als ein Bild enthalten. Wenn die Ressource als PRELOAD markiert ist, lädt Windows alle Bilder in der Ressource, wenn die Anwendung ausgeführt wird.
Folgendes Beispiel gibt 2 Cursor-Ressourcen an; eine mit dem Namen (cursor1) und die andere über eine Nummer (2):
cursor1 CURSOR bullseye.cur 2 CURSOR "d:\\cursor\\arrow.cur"
Cursor werden unter Visual Basic mit der LoadResPicture-Funktion unter Angabe der Ressourcen-ID und des Parameters vbResCursor geladen.
BITMAP Ressource
nameID BITMAP [load-mem] filename
Die BITMAP Ressourcendefinition-Anweisung bestimmt eine Bitmap, die von einer Anwendung für die Bildschirmdarstellung oder als Teil eines Menüs oder Steuerelements verwendet wird.
Parameter
Parameter | Beschreibung |
---|---|
load-mem | Gibt Lade- und Speicherattribute der Ressource an. |
Gibt Lade- und Speicherattribute der Ressource an | Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, die die Ressource identifiziert. |
filename | Gibt den Namen der Datei an, die die Ressource enthält. Der Name muss ein gültiger Dateiname sein; wenn sich die Datei nicht im Arbeitsverzeichnis befindet, muss der volle Pfad der Datei angegeben werden. Der Pfad kann optional in Anführungszeichen gestellt werden |
Tabelle 12
Folgendes Beispiel definiert 2 Bitmap-Ressourcen:
disk1 BITMAP disk.bmp 12 BITMAP PRELOAD diskette.bmp
Bitmaps können in einer Anwendung mit der Funktion LoadBitmap geladen werden, unter Visual Basic wird dazu die LoadResPicture-Funktion in Verbindung mit dem vbResBitmap-Parameter verwendet.
Ressourcen in Visual Basic
LoadResString-Funktion
Diese Funktion Lädt eine Zeichenfolge aus einer Ressourcendatei (.res). Der Index erforderlich und muß eine Ganzzahl sein, die die Kennung (ID) der Daten in der Ressourcendatei angibt. Die Ressource mit der ID 1 ist für das Anwendungssymbol reserviert.
Syntax: LoadResString(Index)
Sie können die LoadResString-Funktion anstelle von Zeichenfolgenkonstanten in Ihrem Code verwenden. Das Speichern langer Zeichenfolgen mit Daten und der Zugriff auf diese Elemente aus Ressourcendateien verkürzt die Ladezeit, da Sie die Elemente einzeln bei Bedarf aus der Ressourcendatei laden können und nicht alle gleichzeitig laden müssen, wenn ein Form-Objekt geladen wird.
LoadResPicture-Funktion
Diese Funktion lädt eine Bitmap, ein Symbol (Icon) oder einen Cursor aus einer Ressourcendatei (.res).
Syntax: LoadResPicture(Index, Format)
Der Index ist erforderlich und muß eine Ganzzahl oder Zeichenfolge sein, die die Kennung (ID) der Daten in der Ressourcendatei angibt. Die Ressource mit der ID 1 ist für das Anwendungssymbol reserviert. Für Format muß ein Wert oder Konstante eingesetzt werden, der/die das Format der zurückgegebenen Daten angibt, wie in folgender Tabelle erläutert.
Werte für Format
Konstante | Wert | Beschreibung |
---|---|---|
vbResBitmap | 0 | Bitmap-Ressource |
vbResIcon | 1 | Symbolressource |
vbResCursor | 2 | Cursor-Ressource |
Tabelle 13
Sie können die LoadResPicture-Funktion verwenden, anstatt sich auf Grafiken zu beziehen, die in der Picture-Eigenschaft eines Form-Objekts oder eines Steuerelements gespeichert sind.
Das Speichern von Bitmaps, Symbolen und Cursor-Abbildungen in Ressourcendateien und der Zugriff auf diese Elemente aus Ressourcendateien verkürzt die Ladezeit, da Sie die Elemente einzeln bei Bedarf aus der Ressourcendatei laden können und nicht alle gleichzeitig laden müssen, wenn ein Form-Objekt geladen wird.
LoadResData-Funktion
Diese Funktion lädt Daten aus mehreren möglichen Typen von Ressourcendateien (.res) und gibt ein Byte-Datenfeld zurück.
Syntax: LoadResData(Index, Format)
Der Index ist erforderlich und muß eine Ganzzahl oder Zeichenfolge sein, die die Kennung (ID) der Daten in der Ressourcedatei angibt. Die Ressource mit der ID 1 ist für das Anwendungssymbol reserviert. Format gibt den Wert, des Originalformats der zurückgegebenen Daten, an, wie unter Einstellungen beschrieben. Der Wert kann auch der Zeichenfolgenname einer benutzerdefinierten Ressource sein.
Werte für Format
Typ | Beschreibung |
---|---|
Accelerator | Zugriffstastentabellen |
Bitmap | Bitmap-Grafiken aller Farbtiefen, keine JPEGs, GIFs etc. |
Cursor | Cursor-Dateien |
Dialog* | Verschiedene Dialoge |
HTML* | HTML-Dokumente |
Icon | Icon-Dateien |
Menu* | Menüs |
String Table | Texttabellen |
Toolbar* | Werkzeugleisten |
Version* | Versionsinformation |
Custom | Benutzerdefinierte Datentypen z.B. "CUSTOM" oder "WAVE" |
Tabelle 14 : Die mit * markierten Typen werden von Visual Basic nicht unterstützt.
Die von LoadResData aus der Ressourcedatei geladenen Daten können maximal 64 KB umfassen. Bei Verwendung von LoadResData mit einer Bitmap-, Symbol- oder Cursor-Ressource wird eine Zeichenfolge zurückgegeben, die die eigentlichen Bits in der Ressource enthält. Wenn Sie diese Bitmap, Ressource oder dieses Symbol einsetzen möchten, verwenden Sie die LoadResPicture-Funktion.
LoadResData kann beim Lokalisieren einer Visual Basic-Anwendung sinnvoll eingesetzt werden, da die Ressourcen, die übersetzt werden müssen, in einer Ressourcendatei zusammengefasst sind. Es ist nicht notwendig, auf den Quell-Code zuzugreifen oder die Anwendung neu zu kompilieren.
Beispiele zur Verwendung von Ressourcen
ResDemo
Einfaches Beispiel zur Verwendung der gängigen Ressourcentypen in Visual Basic.
Projekt als Download [5200 Bytes]
LoadResFile
JPEGs, GIFs, DLLs, Anwendungen etc. können über Ressourcendateien in die .exe einkompiliert werden. Die maximale Grösse pro eingebundener Datei ist 64 KB.
Projekt als Download [36600 Bytes]
PlayResWave
Waves können in die .exe einkompiliert und wiedergegeben werden.
Projekt als Download [8800 Bytes]
VBResDLL
Eine Anwendung lädt die Beschriftungen und Grafiken aus einer ActiveX-DLL. So könnte je nach Sprache immer eine andere ActiveX-DLL verwendet werden, wobei die gleiche .exe verwendet wird.
Projekt als Download [8000 Bytes]
DesktopForm
Anwendungsicon aus der Ressourcendatei.
Projekt als Download [17600 Bytes]
Ihre Meinung
Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.