Ich verwende sakuras code von
http://www.delphipraxis.net/internal...ht=getfileinfo
um von
dll/exe's den CompanyName auszulesen.
leider werden bei gewissen
DLL's falsche/keine werte zurückgeliefert, z.b. bei denen von inprise.
Delphi-Quellcode:
getfileinfo(s,d,'C:\Programme\Borland\Delphi5\bin\rlink32.dll');
showmessage(s);
u.a. funktioniert es mit keiner einzigen
DLL/EXE aus meiner Delphi 5 Installation.
Verwende ich hingegen die rechte maustaste im explorer, wird fehlerfrei Inprise Corporation, usw angezeigt.
Der VeryQueryValue-Aufruf mit \VarFileInfo\Translation liefert einen falschen wert zurück
woran liegt das ?
ich habe mir nun folgenden work-around "gezimmert". Ich denke aber mal dass es auch einen "sauberen" weg geben muss, an den richtige Translationwert zu kommen...
Delphi-Quellcode:
VerQueryValue(buf, '\VarFileInfo\Translation', Translation, len );
VersionValue := '\StringFileInfo\' + IntToHex(LoWord(LongInt(Translation^)), 4) +
IntToHex(HiWord(LongInt(Translation^)), 4) + '\';
goto next;
{ VersionValue := '\StringFileInfo\040904E4\'; }
first:
// let us try it the the "clean" way first
inc(cardinal(p2),134);
goto next2;
first2:
inc(cardinal(p2),$44);
next2:
Versionvalue := '\StringFileInfo\' + widechartostring(p2)+'\';
next:
for i := 0 to length(tfiNames)-1 do
begin
z:=versionvalue + tfiNames[tfiElements(i)];
if VerQueryValue(Buf, PChar(z), Pointer(Value), Len) then
result.fields[tfielements(i)] := Value
else if p2 = buf then goto first
else if cardinal(p2) = cardinal(buf) + 134 then goto first2;
end;