Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Caracteres extraños al ejecutar función <GetFileVersionInfo> (https://www.clubdelphi.com/foros/showthread.php?t=84246)

agustibaldo 25-09-2013 17:23:06

Caracteres extraños al ejecutar función <GetFileVersionInfo>
 
Gente de ClubDelphi, les consulto por un problema que tengo.
Al ejecutar mi aplicación tengo un splash que muestra información sobre el nombre de la aplicación, el nro de versión, etc.
Al mostrar el nombre de la aplicación mediante la siguiente función:

Código Delphi [-]
function fncGetAppDescripcion:string;
var
  Size, Size2: DWord;
  Pt, Pt2: Pointer;
  zKeyPath : array[0..255] of Char;
begin
  try
      Size := GetFileVersionInfoSize(PChar(ParamStr(0)), Size2);
      if Size > 0 then
      begin
         GetMem (Pt, Size);
         try
            GetFileVersionInfo(PChar(ParamStr(0)), 0, Size, Pt);
            VerQueryValue(Pt, StrPCopy(zKeyPath,'\\StringFileInfo\\2C0A04E4\\FileDescription'), Pt2, Size2);
        Result := PWideChar(Pt2);
         finally
            FreeMem (Pt);
         end;
      end;
  except
    Result := Application.Title;
  end;
end;

me entrega la siguiente cadena de caracteres:

Código:

'◿ᅠ瞯邐邐ミ'#$D825'꼐遷邐邐ヒ譕诬'#$0C45'䶋樈─'#$FFFF'ÿ児ꗨ!崀'#$08C2'退邐邐쀳ԸȨ瞯锏쏀邐邐ミ쀥꼑遷邐邐◿ᄰ瞯횋'#$1CE9'C退邐邐啓'#$DB33'喋謄E¹'#$FF00#$0BFF'瓀윏M孝郃啓㌈觀␄ꅤ0'
Estoy usando XE3 sobre Windows 7.
Alguno puede darme una mano con esto?
Desde ya, muchas gracias!

Neeruu 25-09-2013 17:39:47

Prueba con esta Función...

Esta la uso para conseguir la versión de mi Programa...
Puedes modificarla para conseguir el nombre...

Código Delphi [-]
function GetAppVersion:String;
var Size, Size2: DWord;
   Pt, Pt2: Pointer;
begin
    Size := GetFileVersionInfoSize(PChar (ParamStr (0)), Size2);
    if Size > 0 then
     begin
          GetMem (Pt, Size);
          try
             GetFileVersionInfo (PChar (ParamStr (0)), 0, Size, Pt);
             VerQueryValue (Pt, '\', Pt2, Size2);
             with TVSFixedFileInfo (Pt2^) do
              begin
                   Result:= IntToStr (HiWord (dwFileVersionMS)) + '.' +
                            IntToStr (LoWord (dwFileVersionMS)) + '.' +
                            IntToStr (HiWord (dwFileVersionLS)) + '.' +
                            IntToStr (LoWord (dwFileVersionLS));
              end;
          finally
                 FreeMem (Pt);
          end;
     end;
end;

Si la modificas y anda publica...
Saludos...

agustibaldo 25-09-2013 18:47:58

Neeruu gracias por tu respuesta.
De hecho, la función que pasas la utilizo para obtener el nro. de versión de mi app.
Voy a investigar como modificar los parámetros de la API para probar. Igual sospecho que puede ser un problema con la codificación de los caracteres.
Gracias por tu respuesta. Cualquier novedad que encuentre la publico.
Saludos.

egostar 25-09-2013 19:09:15

Hola

Cambia ésto:

Código Delphi [-]
Result := PWideChar(Pt2);

por ésto:

Código Delphi [-]
Result := PAnsiChar(Pt2);

Saludos

agustibaldo 25-09-2013 19:50:38

egostar, gracias por tu respuesta.
Probé como indicaste y, si bien cambió el formato del mensaje, sigue arrojando caracteres extraños.
Saludos.

Código:

'ÿ%`'#$11'¯w'#$0090#$0090#$0090#$0090#$0090'ÿ%Ø'#$10'¯w'#$0090#$0090#$0090#$0090#$0090'‹ÿU‹ì‹E'#$C'‹M'#8'j'

nlsgarcia 26-09-2013 01:03:49

agustibaldo,

Cita:

Empezado por agustibaldo
...Caracteres extraños al ejecutar función <GetFileVersionInfo>...

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TFileVersion = Record
    CompanyName : String;
    FileDescription : String;
    FileVersion : String;
    InternalName : String;
    LegalCopyright : String;
    LegalTrademarks : String;
    OriginalFileName : String;
    ProductName : String;
    ProductVersion : String;
    Comments : String;
    PrivateBuild : String;
    SpecialBuild : String;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetFileInfo(const FileName: String): TFileVersion;
type
   PLandCodepage = ^TLandCodepage;
   TLandCodepage = Record
      Language : Word;
      CodePage : Word;
   end;

var
   Dummy,
   LenBuffer: Cardinal;
   Buffer, lpBuffer: Pointer;
   Language: String;

begin

   LenBuffer := GetFileVersionInfoSize(PChar(FileName), Dummy);

   if LenBuffer = 0 then
      RaiseLastOSError;

   GetMem(Buffer, LenBuffer);

   try

      if not GetFileVersionInfo(PChar(FileName), 0, LenBuffer, Buffer) then
         RaiseLastOSError;

      if not VerQueryValue(Buffer, '\VarFileInfo\Translation\', lpBuffer, LenBuffer) then
         RaiseLastOSError;

      Language := Format('%.4x%.4x', [PLandCodepage(lpBuffer)^.Language, PLandCodepage(lpBuffer)^.CodePage]);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\CompanyName'), lpBuffer, LenBuffer) then
         Result.CompanyName := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\FileDescription'), lpBuffer, LenBuffer) then
         Result.FileDescription := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\FileVersion'), lpBuffer, LenBuffer) then
         Result.FileVersion := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\InternalName'), lpBuffer, LenBuffer) then
         Result.InternalName := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\LegalCopyright'), lpBuffer, LenBuffer) then
         Result.LegalCopyright := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\LegalTrademarks'), lpBuffer, LenBuffer) then
         Result.LegalTrademarks := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\OriginalFileName'), lpBuffer, LenBuffer) then
         Result.OriginalFileName := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\ProductName'), lpBuffer, LenBuffer) then
         Result.ProductName := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\ProductVersion'), lpBuffer, LenBuffer) then
         Result.ProductVersion := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\Comments'), lpBuffer, LenBuffer) then
         Result.Comments := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\PrivateBuild'), lpBuffer, LenBuffer) then
         Result.PrivateBuild := PChar(lpBuffer);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\SpecialBuild'), lpBuffer, LenBuffer) then
         Result.SpecialBuild := PChar(lpBuffer);

   finally

      FreeMem(Buffer);

   end;

end;

function GetFileDescription(const FileName: String): String;
type
   PLandCodepage = ^TLandCodepage;
   TLandCodepage = Record
      Language : Word;
      CodePage : Word;
   end;

var
   Dummy,
   LenBuffer: Cardinal;
   Buffer, lpBuffer: Pointer;
   Language: String;

begin

   LenBuffer := GetFileVersionInfoSize(PChar(FileName), Dummy);

   if LenBuffer = 0 then
      Exit;

   GetMem(Buffer, LenBuffer);

   try

      GetFileVersionInfo(PChar(FileName), 0, LenBuffer, Buffer);

      VerQueryValue(Buffer, '\VarFileInfo\Translation\', lpBuffer, LenBuffer);

      Language := Format('%.4x%.4x', [PLandCodepage(lpBuffer)^.Language, PLandCodepage(lpBuffer)^.CodePage]);

      if VerQueryValue(Buffer, PChar('\StringFileInfo\' + Language + '\FileDescription'), lpBuffer, LenBuffer) then
         Result := PChar(lpBuffer);

   finally

      FreeMem(Buffer);

   end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
   FileVersion : TFileVersion;

begin

   FileVersion := GetFileInfo(Application.ExeName);

   ListBox1.Clear;

   if FileVersion.CompanyName <> EmptyStr then
      ListBox1.Items.Add('CompanyName: ' + FileVersion.CompanyName);

   if FileVersion.FileDescription <> EmptyStr then
      ListBox1.Items.Add('FileDescription: ' + FileVersion.FileDescription);

   if FileVersion.FileVersion <> EmptyStr then
      ListBox1.Items.Add('FileVersion: ' + FileVersion.FileVersion);

   if FileVersion.InternalName <> EmptyStr then
      ListBox1.Items.Add('InternalName: ' + FileVersion.InternalName);

   if FileVersion.LegalCopyright <> EmptyStr then
      ListBox1.Items.Add('LegalCopyright: ' + FileVersion.LegalCopyright);

   if FileVersion.LegalTrademarks <> EmptyStr then
      ListBox1.Items.Add('LegalTrademarks: ' + FileVersion.LegalTrademarks);

   if FileVersion.OriginalFileName <> EmptyStr then
      ListBox1.Items.Add('OriginalFileName: ' + FileVersion.OriginalFileName);

   if FileVersion.ProductName <> EmptyStr then
      ListBox1.Items.Add('ProductName: ' + FileVersion.ProductName);

   if FileVersion.ProductVersion <> EmptyStr then
      ListBox1.Items.Add('ProductVersion: ' + FileVersion.ProductVersion);

   if FileVersion.Comments <> EmptyStr then
      ListBox1.Items.Add('Comments: ' + FileVersion.Comments);

   if FileVersion.PrivateBuild <> EmptyStr then
      ListBox1.Items.Add('PrivateBuild: ' + FileVersion.PrivateBuild);

   if FileVersion.SpecialBuild <> EmptyStr then
      ListBox1.Items.Add('SpecialBuild: ' + FileVersion.SpecialBuild);

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   ShowMessage(GetFileDescription(Application.ExeName));
end;

end.
El código anterior en Delphi 7 y Delphi 2010 sobre Windows 7 Professional x32, muestra la información asociada al ejecutable de la aplicación por medio de las APIs GetFileVersionInfoSize, GetFileVersionInfo y VerQueryValue.

Espero sea útil :)

Nelson.

agustibaldo 26-09-2013 16:12:23

nlsgarcia, muchas gracias por tu respuesta.
Lamentablemente sigo "atascado en el medio". :(
Implemente la rutina que me pasaste pero no muestra ningún texto de salida. Es decir, devuelve vacío.
Conversando con mi compañeros de oficina que compilan el mismo código pero en sus PC, ellos no tienen problemas.
Podría ser que exista algún problema con las fuentes en mi PC o con algún seteo de Delphi que pueda estar molestando?
Nuevamente gracias a todos por sus respuestas.
Saludos.

nlsgarcia 26-09-2013 16:54:34

agustibaldo,

Cita:

Empezado por agustibaldo
...Implemente la rutina que me pasaste pero no muestra ningún texto de salida...

...mi compañeros de oficina que compilan el mismo código pero en sus PC, ellos no tienen problemas...

Pregunto:

1- ¿Que versión de Delphi utilizan en la oficina?.

2- ¿Que versión de Windows utilizan en la oficina?.

3- ¿Por el mismo código te refieres al del Msg #6?.

4- ¿La aplicación en cuestión en tu PC tiene habilitado la opción: Proyect -> Options -> Version Info -> Include version information in project?.

5- ¿Si utilizas el código del Msg #6 en tu PC con esta ruta 'C:\Windows\System32\kernel32.dll', funciona?.

Espero sea útil :)

Nelson.

nlsgarcia 26-09-2013 18:26:28

agustibaldo,

Cita:

Empezado por agustibaldo
...¿Podría ser que exista algún problema con las fuentes en mi PC o con algún seteo de Delphi que pueda estar molestando?...

Continuación del Msg #8:

Te comento: Probé el código del Msg #6 (Delphi 7 y Delphi 2010), en Windows XP Professional x32, Windows 7 Professional x32, Windows 7 Professional x64 (Todos en Ingles) y Windows Vista Home Premium x32 (En Español) y en todos los casos funciono correctamente.

Espero sea útil :)

Nelson.

agustibaldo 26-09-2013 18:50:42

Cita:

1- ¿Que versión de Delphi utilizan en la oficina?.

2- ¿Que versión de Windows utilizan en la oficina?.

3- ¿Por el mismo código te refieres al del Msg #6?.

4- ¿La aplicación en cuestión en tu PC tiene habilitado la opción: Proyect -> Options -> Version Info -> Include version information in project?.

5- ¿Si utilizas el código del Msg #6 en tu PC con esta ruta 'C:\Windows\System32\kernel32.dll', funciona?.
nlsgarcia, he podido solucionar el problema!!!
Primero, respondo tus consultas:

1- Delphi 2010 y estamos migrando a XE3.

2- Windows 7.

3- Por mismo código me refiero a que, esta función con "problemas", se ejecuta en librerías compartidas por todos.

4- Si, esta habilitada la opción Include version information in project?


Te comento como solucioné el inconveniente.
Cuando revise la opción que planteas en la pregunta 4, me dí cuenta que el Language estaba seteado a Ingles (Estados Unidos). Probé setearlo a Español (Argentina) y luego probé compilarlo nuevamente. Aparecía nuevamente el mismo problema.
Entonces, volví al mismo cuadro de diálogos y bajo la opción de Language estaba la lista con las opciones que describías en tu función. Procedí a completar la Key FileDescription y volví a probar nuevamente. Ahora todo funcionó de 10!

Ahora bien:
1º) el tema esta solucionado.

2º) me sigue llamando la atención que este problema se manifiesta solo con mi PC, no así en el resto de mis compañeros. En nuestro grupo de trabajo, podemos compilar los proyectos de todos, por lo que estas opciones deberían estar seteadas en todos los proyectos cuando esto no ocurre en todos los casos.
Igualmente sigo investigando y cualquier cosa les comento.
Muchas gracias a todos por sus comentarios y respuestas.
Saludos.

nlsgarcia 26-09-2013 19:08:36

agustibaldo,

Cita:

Empezado por agustibaldo
...¿Podrías explicarme que es el Msg #6?...

Todos los mensajes de un hilo están numerados, el Msg #6 es el sexto mensaje de este hilo y su código asociado.

Cita:

Empezado por agustibaldo
...bajo la opción de Language estaba la lista con las opciones que describías en tu función (Msg #6). Procedí a completar la Key FileDescription y volví a probar nuevamente. Ahora todo funcionó de 10!...el tema esta solucionado...

^\||/

Cita:

Empezado por agustibaldo
...En nuestro grupo de trabajo, podemos compilar los proyectos de todos, por lo que estas opciones deberían estar seteadas en todos los proyectos cuando esto no ocurre en todos los casos...Igualmente sigo investigando y cualquier cosa les comento...

Te sugiero revisar la ruta por defecto al momento de compilar un proyecto localmente o en red.

Espero sea útil :)

Nelson.

agustibaldo 26-09-2013 21:06:25

Cita:

Todos los mensajes de un hilo están numerados, el Msg #6 es el sexto mensaje de este hilo y su código asociado.
Jajajaja, una vez que hice el posteo de mi última respuesta, ví que habías hecho una entrada anterior (la cual no se había refrescado) y entendí que era el Msg #6, edité mi entrada pero llegaste a leerla.. Je! :D

De todas formas, volviendo a lo que decís revise las rutas y están correctamente apuntadas a los directorios locales donde guarda el EXE y los DCU.
Muchas gracias!
Saludos.


La franja horaria es GMT +2. Ahora son las 17:52:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi