Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-09-2013
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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!
Responder Con Cita
  #2  
Antiguo 25-09-2013
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 485
Poder: 17
Neeruu Va por buen camino
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...
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
  #3  
Antiguo 25-09-2013
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 25-09-2013
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Hola

Cambia ésto:

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

por ésto:

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

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #5  
Antiguo 25-09-2013
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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'
Responder Con Cita
  #6  
Antiguo 26-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por nlsgarcia fecha: 26-09-2013 a las 01:13:46.
Responder Con Cita
  #7  
Antiguo 26-09-2013
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 26-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por nlsgarcia fecha: 26-09-2013 a las 17:05:19.
Responder Con Cita
  #9  
Antiguo 26-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.
Responder Con Cita
  #10  
Antiguo 26-09-2013
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 26-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por nlsgarcia fecha: 26-09-2013 a las 19:17:09.
Responder Con Cita
  #12  
Antiguo 26-09-2013
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
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!

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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Caracteres extraños en un Memo Sr.Scorpion Varios 1 23-10-2008 19:54:59
Caracteres extraños en un Memo Sr.Scorpion Varios 6 23-10-2008 14:47:05
Caracteres extraños (#$D#$A) Iuconlas Varios 2 23-09-2005 17:09:05
caracteres extraños en reportes Tangela Conexión con bases de datos 0 21-01-2004 19:56:22
Caracteres extraños Germi Conexión con bases de datos 1 14-10-2003 15:26:18


La franja horaria es GMT +2. Ahora son las 11:31:47.


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
Copyright 1996-2007 Club Delphi