Hallo Luckie,
da ich bei meinen Programmen weiß, wie der resource file aufgebaut ist, kann ich auf die Auswertung von VarFileInfo\Translation verzichten:
Delphi-Quellcode:
procedure GetFileVersionLanguage(var FileVersionLanguage: string);
var
lcid: cardinal;
cp: string;
begin
lcid := GetUserDefaultLCID;
SetLength(cp, GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, nil, 0));
GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, @cp[1], Length(cp));
FileVersionLanguage := IntToHex(lcid, 4) + IntToHex(StrToInt(cp), 4);
end;
Mit diesem Code lese ich genau die Strings aus, die auf der Zielmaschine sinnvoll sind - und die ich vorher in meinen resfile geschrieben habe. Da auch du die Resourcen von ParamStr(0) untersuchst, treibst du relativ viel Aufwand zur Ermittlung der language specs - aber immer noch deutlich weniger Aufwand als Olli (abgesehen von dem Fehler).
Wenn du einen resource viewer bauen willst, dann wird der Aufwand noch viel größer sein müssen. Nicht nur, dass mehrere language/codepage Paare spezifiziert sein können, die zugehörigen strings können mit deiner Methode eventuell unerreichbar sein, denn auch sowas wird kompiliert:
Code:
...
FILETYPE VFT_APP
{
BLOCK "StringFileInfo"
{
VALUE "CompanyName", "NameOfCompany\000"
VALUE "FileDescription", "Description\000"
VALUE "FileVersion", "1.2.3.4\000"
VALUE "InternalName", "InternalName\000"
VALUE "LegalCopyright", "Copyright\000"
VALUE "LegalTrademarks", "Trademark\000"
VALUE "OriginalFilename", "OriginalFileName\000"
VALUE "ProductName", "ProductName\000"
VALUE "ProductVersion", "1.0.0.0\000"
VALUE "Comments", "Comments\000"
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0, 0
}
}
Bei einem Viewer müsstest du den memory block anhand der definierten Strukturen parsen, aber dann hättest du sicher nicht ParamStr(0) verwendet...
Grüße vom marabu