Naja für den Anwendungsfall weiß ich schon vorher das es keine
DLL Dateien sein werden.
Aber wenn alles funktioniert ändere ich den Code ab, wie Du vorgeschlagen hast. Schon damit er sauberer ist.
Gut. Sicher ist sicher. Irgendwann mal möchtest du vielleicht eine
DLL benutzen, dann kannst du den Code auch wiederverwenden.
Ich habe noch mal kurz recherchiert und es wundert mich nicht, dass dein Code nicht funktioniert. Er zeugt davon, dass dir der Unterschied zwischen RT_ICON und RT_GROUP_ICON nicht klar ist.
Unter RT_ICON werden die Rohdaten der Symbole abgespeichert, d.h. die Bitmaps (auch PNGs sind erlaubt seit Vista). Jedes Symbol erhält dabei eine numerische ID (ein 16-Bit-Word).
Unter RT_GROUP_ICON werden dann ein oder mehrere dieser Symbole zu einer Gesamtheit gruppiert (z.B. um dieselbe Grafik in verschiedenen Auflösungen parat zu haben).
'MAINICON' ist dabei die String-ID des Hauptsymbols wie es vom Explorer angezeigt wird. In deinem Code wendest du aber 'MAINICON' auf RT_ICON an, das ist falsch.
Also, RT_ICON = Bitmap / PNG, RT_GROUP_ICON = eine Datenstruktur des Typs "TGroupIconRsrcHeader", gefolgt von einem array of TGroupIconRsrcEntry:
Delphi-Quellcode:
type
TGroupIconRsrcHeader = packed record
wReserved: Word; // 0
wType: Word; // 1 for icons
wCount: Word; // number of icons in this group, each has a following TGroupIconRsrcEntry
// Entries: array [0..idType - 1] of TGroupIconRsrcEntry;
end;
TGroupIconRsrcEntry = packed record
bWidth, bHeight: Byte; // 0 means 256, which is the maximum
bColorCount: Byte; // number of colors in image (0 if wBitCount > 8)
bReserved: Byte; // 0
wPlanes: Word; // 1
wBitCount: Word; // number of bits per pixel
dwSize: DWORD; // size of the icon data, in bytes
wID: Word; // resource ID of the icon (for RT_ICON entry)
end;
Das ganze ist nicht so einfach, wie du es dir vorstellst.