Ich möchte in meine Binaries (Plattformunabhängig) mehrsprachige Versionsinformationen einbinden und lesend nutzen.
Hierzu erzeuge ich eine Ressourcen-Datei (VI.rc) und binde diese mittels {$R VI.rc} ein.
Soweit auch kein Problem, solange nur eine Sprache enthalten ist.
[text]
1 VERSIONINFO
FILEVERSION 1,2,3,4
PRODUCTVERSION 5,6,7,8
//FILEOS VOS_UNKNOWN
//FILETYPE VFT_UNKNOWN
//FILESUBTYPE VFT2_UNKNOWN
FILEFLAGSMASK 0x00000000
FILEFLAGS 0x00000000
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040C04E4"
BEGIN
VALUE "Comments", "\0"
VALUE "CompanyName", "\0"
VALUE "FileDescription", "Französisch(Frankreich)\0"
VALUE "FileVersion", "\0"
VALUE "InternalName", "\0"
VALUE "LegalCopyright", "© Copyright 2009 - 2014, Tous droits réservés.\0"
VALUE "LegalTrademarks", "© Copyright 2009 - 2014, TM\0"
VALUE "OriginalFilename", "\0"
VALUE "PrivateBuild", "\0"
VALUE "ProductName", "\0"
VALUE "ProductVersion", "\0"
VALUE "SpecialBuild", "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x040C, 0x04E4
END
END
[/text]
Sobald nun weitere Sprachen in die Ressource-Datei eingefügt werden, steigt sowohl der Lazarus- als auch der FPCcompiler aus.
Lazarus:
[text]
Compiling resource C:\Users\Admin\Desktop\Ressource\source\..\VI-4.rc
project1.lpr(23,1) Error: Error while compiling resources. Compile with -vd for more details. Check for duplicates.
[/text]
windres:
[text]
windres: C:\\Users\\Admin\\Desktop\\Ressource\\VI-4.rc:28: syntax error
cpp: stdout: Invalid argument
windres: preprocessing failed.
[/text]
Diesem Problem bin ich dann mit dem brcc32 aus dem Weg gegangen und binde jetzt die entsprechende Ressource-Datei (VI.res) ein.
Ich habe mir zum lesen der VersionInfo eine Klasse TmyVersionInfo gebaut, welche auf Basis der Units "versionresource, versiontypes, resource" die
einzelnen Teile "FixedInfo, StringFileInfo, VarFileInfo" zur Verfügung stellt.
Bis hier her funktioniert alles wie gewünscht, wenn eine Ressource-Datei(VI-1.res) mit nur einer Sprache eingebunden ist.
Innerhalb meines Programms kann ich die Versioninfo lesen und auch in Windows\Dateieigenschaften die Ressource einsehen.
Binde ich nun die Ressource-Datei(VI-4.res, "vier Sprachen") ein, kann ich in den jeweiligen OS-SprachVersionen die zugehörige Ressource einsehen.
Innerhalb meines Programmes kommt es aber zu einem Klasse: EReadError, Stream read error.
Der Fehler passiert aber erst beim ausfüren der Methode (FVersResource.FixedInfo).
Nun zu meinen Fragen:
- Handelt es sich bei den Ressource-Compilern um einen Bug oder einen Fehler meinerseits?
- Mir ist leider das Konzept der Plattformunabhängigen Ressourcen nicht bekannt.
Deswegen, können überhaupt mehrsprachige VersionInfos Plattformunabhängig verwendet werden? - Ich würde gerne in die Methode "FVersResource.FixedInfo" mit F7 reinsteppen, dies geht nicht!
Warum?
In project1.lpr kann zwischen den einzelnen Ressourcen umgeschallten werden.