WindowsResources

From HerzbubeWiki
Jump to navigation Jump to search

This page contains German notes about how the resource system works on Windows.

TODO: Translate and beautify this page.


References


Naming conventions

  • http://msdn.microsoft.com/en-us/library/t2zechd4.aspx
  • IDS_* refers to string resources
  • IDI_* refers to icon resources
  • IDB_* refers to bitmap resources
  • IDC_* refers to cursor resources, but within a DIALOG resource (much more often used!) this also refers to dialog control resources
  • IDD_* refers to dialog template resources
  • IDR_* refers to other resource types (primarily menus, accelerators, ribbons)
  • IDM_* is used within a menu resource to refer to menu items that do *NOT* use the MFC command architecture
  • ID_* is used within a menu resource to refer to menu items that *DO* use the MFC command architecture


Valid ID ranges

  • Jede Ressource wird innerhalb eines Moduls (.dll, .exe) durch eine eindeutige ID referenziert
  • F¸r verschiedene Ressource-Typen gibt es unterschiedliche Bereiche, in denen die jeweilige ID liegen muss
  • Details siehe http://msdn.microsoft.com/en-us/library/t2zechd4.aspx
  • G¸ltige Nummern sind grunds‰tzlich 8 - 28671 (0x6FFF)
    • ID 0 ist nie erlaubt
    • ID 1-7 sind f¸r Standard Controls (z.B. IDOK, IDCANCEL) reserviert
    • IDs > 0x7FFF (32767) sind nie erlaubt
    • MFC reserviert die Nummern 0x7000 - 0x7FFF


Which resource types are there?

  • Accelerator (Tastatur-Shortcuts)
  • Dialog (Layout und Inhalte
  • Icon (in den Grˆssen 16x16 und 32x32)
  • Menu (Hauptmen¸ und Popup-Men¸s)
  • String (z.B. Fehlermeldungs-Texte)
  • Toolbar
  • Version (Programmbeschreibung, Versionsnummer, Sprache, etc.)
  • Bitmap (.bmp Files)
  • Video (.avi Files)
  • Registry Fragmente (.rgs Files)
  • Beliebige Daten (Type RCDATA innerhalb des .rc Files)


.rc files

  • .rc Files sind eigentlich Textfiles, die die Ressourcen eines Projekts beschreiben
  • Ein .rc File kann mit #include andere Resource Files inkludieren (nicht beschr‰nkt auf .rc Files). Details siehe
  • Diese kˆnnen aus dem gleichen Projekt, einem anderen Projekt, oder dem System (z.B. MFC) stammen
  • Ueblicherweise wird auch resource.h inkludiert; dies ist ein File mit #define Anweisungen, um die numerischen Resource IDs auf Namen zu mappen
  • Ueblicherweise werden .rc Files vom Resource-Editor, der Teil der IDE ist, automatisch verwaltet, d.h. man nimmt keine manuellen Aenderungen vor
  • Tats‰chlich verwendet der Resource-Editor nicht direkt das .rc File, sondern ein vorg‰ngig daraus kompiliertes .aps File
  • Bei Aenderungen wird das .rc File komplett neu generiert
    • Dadurch gehen z.B. Kommentare verloren, da diese schon bei der Umwandlung .rc -> .aps wegfallen


.rc2 files

  • Die Konvention ist, dass ein Resource-File, welches manuell editiert werden muss, die Endung .rc2 tr‰gt
  • Das .rc2 File wird dann im Haupt-Resource File (welches automatisch vom Resource-Editor verwaltet wird) included


TEXTINCLUDE resources

  • Dieser Resource Typ dient allein dazu, die Informationen abzulegen, die im "Resource Includes" Dialog verwaltet werden
  • Es gibt 3 Resourcen dieses Typs, entsprechend den 3 Abschnitten im "Resource Includes" Dialog
  • Der Inhalt dieser Resourcen hat *KEINEN* Einfluss auf das Kompilieren oder Editieren des Resource Files


"Resource Includes" dialog

  • Der "Resource Includes" Dialog kann so aufgerufen werden:
           Resource View > Resource File selektieren > Kontextmen¸ > Resource Includes
  • Symbol Header File
    • Hier tr‰gt man den blanken Filenamen ein (¸blicherweise "resource.h")
    • Daraus wird die TEXTINCLUDE Resource mit ID 1 generiert
    • Es wird ebenfalls ein #include Statement ganz am Anfang des .rc Files generiert
  • Read-only symbol directives
    • Hier tr‰gt man #include Statements ein, die auf weitere Header Files verweisen, die zus‰tzliche Resource IDs definieren
    • Diese Header Files sind read-only in dem Sinn, dass der Resource Editor nicht versucht, die Resource ID aus dem Header File zu entfernen, wenn die entsprechende Resource aus dem .rc File gelˆscht wird
    • Ueblicherweise tr‰gt man hier z.B. das MFC Resource Header File afxres.h ein
    • Aus allen Eintr‰gen in diesem Bereich wird die TEXTINCLUDE Resource mit ID 2 generiert
    • Die #include Statements werden ebenfalls weit oben im .rc Files eingetragen
  • Compile-time directives
    • Hier tr‰gt man #include Statements ein, die auf weitere .rc Files verweisen, die zur Compile Zeit mt dem Haupt .rc File gemerged werden sollen
    • Die .rc Files sind nicht editierbar und tauchen nicht im Resource Editor auf
    • Aus allen Eintr‰gen in diesem Bereich wird die TEXTINCLUDE Resource mit ID 3 generiert
    • Die #include Statements werden ganz unten im .rc Files eingetragen und mit "#ifndef APSTUDIO_INVOKED" versehen


Loading resources

  • http://msdn.microsoft.com/en-us/library/ms648006.aspx
  • Es gibt diverse Mˆglichkeiten, um eine Ressource zu laden
    • Allgemeing¸ltige Funktionen: FindResource() und LoadResource()
    • Funktionen, die spezifisch f¸r einen bestimmten Ressourcen-Typ sind: LoadString(), LoadMenu(), etc.
    • MAKEINTRESOURCE Macro
  • Allen Funktionen gemeinsam ist, dass sie wissen m¸ssen, *woher* sie die Ressource laden m¸ssen
  • LoadString() und Co. benˆtigen dazu ein Module Handle (HINSTANCE)
    • Ein HINSTANCE Module Handle wird mit AfxGetInstanceHandle() bestimmt
    • Offenbar kˆnnen HMODULE Module Handles, die von LoadLibrary() zur¸ckgegeben werden, ebenfalls als HINSTANCE eingesetzt werden
  • FindResource() und LoadResource() benˆtigen ein Module Handle (HMODULE)
    • Ein HMODULE Module Handle wird z.B. von LoadLibrary() zur¸ckgegeben; anstelle von HMODULE kann aber auch HINSTANCE verwendet werden
    • FindResource() gibt ein HRSRC zur¸ck, ein Handle auf den "Information Block" der gesuchten Ressource
    • Das HRSRC Handle kann dann an LoadResource() ¸bergeben werden - d.h. HRSRC ist auch ein HMODULE
    • LoadResource() gibt ein HGLOBAL Resource Handle zur¸ck, welches eine Art Pointer auf die bin‰ren Daten der Resource sind
    • Normalerweise wird mit den Ressourcen-spezifischen Funktionen gearbeitet und nicht mit LoadResource()
  • Die meisten Ressourcen, die geladen wurden, m¸ssen auch wieder freigegeben werden (z.B. DestroyMenu()); die Ausnahme sind Strings
  • Handles auf Module mit Ressourcen kˆnnen auch mit den folgenden globalen Funktionen managed werden
    • AfxFindResourceHandle(LPCTSTR lpszName, LPCTSTR lpszType) - gibt das HINSTANCE Handle zur¸ck, das die beschriebene Ressource enth‰lt
    • AfxGetResourceHandle() - gibt das HINSTANCE Handle zur¸ck, von dem Ressourcen per Default geladen werden sollen
    • AfxSetResourceHandle() - setzt ebendieses HINSTANCE Handle
  • Das mit AfxSetResourceHandle() gesetzte Handle wird vermutlich in den Module State geschrieben