Problem GetFileVersionInfo / VerQueryValue

Antworten
maksh
Beiträge: 7
Registriert: Mo 18. Aug 2008, 15:37
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schaffhausen

Problem GetFileVersionInfo / VerQueryValue

Beitrag von maksh »

Hallo

ich hab da eine Funktion die unter WIN32 korrekt funktioniert. Sobald ich aber das ganze unter WinCE/Arm kompilieren will bekommen ich die Meldungen wegen den unterschiedlichen Typen (PChar/PWideChar).

Ich hab versucht nach meinem Verständnis das Ganze auf WideChar umzubauen, aber ohne Erfolg.

Hat da jemand ein Beispiel in der Schublade wie ich mit GetFileVersionInfoSize,GetFileVersionInfo,VerQueryValue die Informationen aus der EXE-Datei auslesen kann unter WinCE/Arm.


Hier noch meine Funkltion für WinXP32

Code: Alles auswählen

// Fileinfo
const
  InfoNum                 = 10;
  I_Def                   = 0;
  I_Bez                   = 1;
  I_Value                 = 2;
 
  I_VersionHand           = 1;
  I_ProductName           = 2;
  I_FileVersion           = 3;
  I_FileDescription       = 4;
  I_CompanyName           = 5;
  I_InternalName          = 6;
  I_LegalCopyright        = 7;
  I_LegalTradeMarks       = 8;
  I_OriginalFileName      = 9;
  I_Comments              = 10;
 
var
  InfoStr                 : array[1..InfoNum] of array[0..2] of string =
                           (('ProductVersion','Version',''),
                            ('ProductName','Product-Name',''),
                            ('FileVersion','Build-Version',''),
                            ('FileDescription','Description',''),
                            ('CompanyName','Company',''),
                            ('InternalName','Internal-Name',''),
                            ('LegalCopyright','Copyright',''),
                            ('LegalTradeMarks','TradeMarks',''),
                            ('OriginalFileName','Original-Filename',''),
                            ('Comments','Comments',''));
 
procedure GetDateiInfo(ProgName:string);
var
  nInfoSize, Len, i: DWORD;
  Buf: PChar;
  Value: PChar;
  Trans: DWORD;
  pTrans: array [0..MAX_PATH] of Char;
  s : string;
begin
  for i := 1 to InfoNum do
    InfoStr[i,I_Value] := '';
 
  nInfoSize := GetFileVersionInfoSize(PChar(ProgName), nInfoSize);
  if nInfoSize > 0 then begin
    Buf := AllocMem(nInfoSize);
 
    if GetFileVersionInfo(PChar(ProgName), 0, nInfoSize, Buf) then begin
      // Erst die Sprache(n) ermitteln und dann abfragen
      if VerQueryValue(Buf, '\VarFileInfo\Translation',Pointer(Value), Len) then begin
        // erste Sprache holen
        Trans := HiWord(PDWORD(Value)^) or (Word(PDWORD(Value)^) shl 16);
        wvsprintf(pTrans, '%8.8x', PChar(@Trans));
        s := StrPas(pTrans);
      end;
 
      for i := 1 to InfoNum do begin
        if VerQueryValue(Buf, PChar('\StringFileInfo\'+ s + '\' + InfoStr[i,0]), Pointer(Value), Len) then
          InfoStr[i,I_Value] := Value;
      end;
    end;
    FreeMem(Buf, nInfoSize);
  end
  else InfoStr[I_VersionHand,I_Value] := ('
No version information found');
end;

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem GetFileVersionInfo / VerQueryValue

Beitrag von theo »

> Ich hab versucht nach meinem Verständnis das Ganze auf WideChar umzubauen, aber ohne Erfolg.

Wie hast du's denn versucht?
VerQueryValue benutzt scheint's die Widestring Variante auf WinCE:

function VerQueryValue(pBlock:LPVOID; lpSubBlock:LPWSTR; lplpBuffer:LPVOID; var puLen:UINT):WINBOOL; external KernelDLL name 'VerQueryValueW';

Dann gib ihm halt WideString. http://www.delphibasics.co.uk/RTL.asp?Name=PWideChar

maksh
Beiträge: 7
Registriert: Mo 18. Aug 2008, 15:37
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schaffhausen

Re: Problem GetFileVersionInfo / VerQueryValue

Beitrag von maksh »

Hallo

ich hab da verschiedenes Versucht.

1.Variante ProgName als Widestring
2.Buf als Pointer und alle PChar als PWideChar

Aber mein Gedanke geht in die Richtung, dass da etwas mit Ansi und UTF8 oder so im Argen liegt.
Irgendwo fehlt da eine Umwandlung. Aber ich finde nicht heraus, in welche Richtung und wo genau.

Ich hab zum Beispiel Zeile 44 und Zeile 48 so abgeändert, dass ich direkt eine Zeichenfolge da eingefügt habe.

Code: Alles auswählen

'\Verzeichnis\Verzeichnis\prog.exe'

Dann hat es wenigstens soweit funktioniert, dass er bis zur Zeile 50 gekommen ist.

Antworten