Seite 1 von 1

StringFileInfo von VLC.exe korrekt?

Verfasst: 08.08.2010 12:43
von Sicro
Hallo PB'ler,

ich programmiere derzeit ein Programm, dass von Programmdateien (*.exe) die StringFileInfo-Daten ausliest.
Das Programm funktioniert schon mit fast allen Programmdateien korrekt, nur bei VLC.exe und ein paar anderen leider nicht.

Als ich mir den Unterschied der funktionierenden und nicht funktionierenden Programmdateien angesehen habe, fiel mir auf
das der Eintrag des Blocks "VarFileInfo" gar nicht in dem Block "StringFileInfo" vorhanden ist.

Code: Alles auswählen

1 VERSIONINFO
FILEVERSION 1,1,0,0
PRODUCTVERSION 1,1,0,0
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
	BLOCK "040904E4"
	{
		VALUE "CompanyName", "the VideoLAN Team"
		VALUE "ProductName", "VLC media player"
		VALUE "ProductVersion", "1,1,0,0"
		VALUE "InternalName", ""
		VALUE "OriginalFilename", "vlc.exe"
		VALUE "FileVersion", "1.1.0"
		VALUE "FileDescription", "VLC media player"
		VALUE "LegalCopyright", "(c) 1996-2010 the VideoLAN Team"
	}
}

BLOCK "VarFileInfo"
{
	VALUE "Translation", 0x0409 0x04B0
}
}
Haben da die Programmierer geschlampt?

Mfg Sicro

Re: StringFileInfo von VLC.exe korrekt?

Verfasst: 17.08.2010 11:55
von Frank Smart
Hallo,

was soll daran jetzt nicht korrekt sein? Siehe auch:

http://msdn.microsoft.com/en-us/library ... S.85).aspx

Liebe Grüße,

Frank

Re: StringFileInfo von VLC.exe korrekt?

Verfasst: 28.08.2010 17:04
von Sicro
Hallo Frank Smart,

sämtliche Codes, die ich im Internet gefunden habe, lesen erst den Eintrag von VarFileInfo/Translation:

Code: Alles auswählen

NeededBufferSize = GetFileVersionInfoSize_(@FilePath,0)
*Buffer = AllocateMemory(NeededBufferSize)
GetFileVersionInfo_(@FilePath,0,NeededBufferSize,*Buffer)
VerQueryValue_(*Buffer,"\\VarFileInfo\\Translation",@Pointer,@PointerLen)
TranslationCode.s = RSet(Hex(PeekW(Pointer)),4,"0") + RSet(Hex(PeekW(Pointer + 2)),4,"0")
Danach wird der ermittelte Wert für die Ermittlung der eigentlichen Informationen verwendet, z. B.:

Code: Alles auswählen

VerQueryValue_(*Buffer,"\\StringFileInfo\\" + TranslationCode + "\\FileVersion",@Pointer,@PointerLen)
Debug PeekS(Pointer)
Mit dem ersten Code bekomme ich bei VLC.exe den Wert "4094B0", wie er auch in der Datei vorhanden ist.
Beim zweiten Code werden keine Informationen zurückgeliefert, weil es den Block "4094B0" im Block "StringFileInfo" nicht gibt, sondern den Block "040904E4".

Nun frage ich mich, wie korrekt vorgegangen werden muss, um den Wert "040904E4" zu ermitteln.

Ich könnte zwar die Informationen mit ReadFile() selber raussuchen, aber irgentwie muss das ja mit der Win-API gehen.

Klicke ich mit der rechten Maustaste auf die VLC.exe und wähle "Eigenschaften" werden mir die Einträge des StringFileInfo-Blocks ja auch angezeigt.

Mfg Sicro