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 24-10-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¿GetFileVersionInfo modifica su primer parámetro? (FileName, la ruta de archivo dada)

Hola, voy a trabajar con la función GetFileVersionInfo de la API de Windows, la cual sirve para obtener datos de un archivo ejecutable, como su versión, fabricante, etcétera.

En la unidad SysUtils de Delphi viene una rutina que hace uso de ella (también he visto varias clases de terceros que la implementan):

Código Delphi [-]
function GetFileVersion(const AFileName: string): Cardinal;
var
  FileName: string;
  InfoSize, Wnd: DWORD;
  VerBuf: Pointer;
  FI: PVSFixedFileInfo;
  VerSize: DWORD;
begin
  Result := Cardinal(-1);
  // GetFileVersionInfo modifies the filename parameter data while parsing.
  // Copy the string const into a local variable to create a writeable copy.
  FileName := AFileName;
  UniqueString(FileName);
  InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
  if InfoSize <> 0 then
  begin
    GetMem(VerBuf, InfoSize);
    try
      if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
        if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then
          Result:= FI.dwFileVersionMS;
    finally
      FreeMem(VerBuf);
    end;
  end;
end;

Lo que me llama la atención es esa afirmación de "GetFileVersionInfo modifies the filename parameter". Entiendo y encuentro lógico que debido a ello Borland usara una cadena alterna "UniqueString(FileName)".

Pero al hacer pruebas no encontré que GetFileVersionInfo realmente modificara el valor del primer argumento. Así que mi duda es por qué se tiene esa precaución y, asumiendo que la afirmación del comentario es cierta, ¿en qué circunstancias ocurre tal modificación?

Esta vez no tuve suerte en Google, ¿alguna pista?

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 24-10-2012
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

A ver. Voy a tirar al aire con lo primero (y más simple, porque, de mi cerebro no pueden salir sino cosas simples) que se me ocurre. Digo que acaso el prototipo de dicha función se definió en su día con un argumento "constante". Tiempo después, por el motivo que fuese, se vió que era menester modificar dicho argumento, de manera que no valía que se dejase como constante. Si estoy en lo cierto, tal vez se tomó la solución "chapuza", esto es, utilizar una variable local para hacer las modificaciones correspondientes, manteniendo el prototipo de la función, ¡digo yo!, por razones de compatibilidad...

P.D. En efecto, esta explicación mía no puede tener sentido,... ¿verdad que no tiene sentido? Y por diversas razones además, casi estoy por borrar este mensaje...
Responder Con Cita
  #3  
Antiguo 24-10-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Quizá algún "bug" en alguna versión antigua de Windows y el "parche se quedó hasta nuestros dias. En todo caso la ocumentación de la API no dice nada al respecto.

// Saludos
Responder Con Cita
  #4  
Antiguo 24-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.099
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Yo uso esa función desde hace muchos años en todos los proyectos y nunca he tenido problemas de ese tipo, (sólo la he usado en winXP con D7 y D2007)
Responder Con Cita
  #5  
Antiguo 24-10-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pero, ¿usas directamente la API de Windows o la función de la unidad SysUtils?

// Saludos
Responder Con Cita
  #6  
Antiguo 24-10-2012
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
O sea, que, mi respuesta mi mirarla siquiera.
Responder Con Cita
  #7  
Antiguo 24-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.099
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
Pero, ¿usas directamente la API de Windows o la función de la unidad SysUtils?
// Saludos
Ahí me has pillado... voy a ver...
Es la que está implementada en 'windows'; y es este código horroroso:

Código Delphi [-]
function getmVersion(cExe:string='') : string;
var
  InfoSize, H, RsltLen: cardinal;
  VersionBlock: pointer;
  Rslt: PVSFixedFileInfo;
begin
  if (cExe='') or (not FileExists(cExe)) then
    cExe := Application.ExeName;
  //
  //InfoSize := GetFileVersionInfoSize(PChar(Application.ExeName), H);
  InfoSize := GetFileVersionInfoSize(pChar(cExe), H);
  VersionBlock := AllocMem(InfoSize);
  try
    //GetFileVersionInfo(pChar(Application.ExeName), H, InfoSize, VersionBlock);
    GetFileVersionInfo(pChar(cExe), H, InfoSize, VersionBlock);
    VerQueryValue(VersionBlock, '\', Pointer(Rslt), RsltLen);
    result := Format('%d.%d.%d.%d', [
    Rslt.dwProductVersionMS div 65536,
    Rslt.dwProductVersionMS mod 65536,
    Rslt.dwProductVersionLS div 65536,
    Rslt.dwProductVersionLS mod 65536]);
  finally
    FreeMem(VersionBlock);
  end;
end;
Responder Con Cita
  #8  
Antiguo 24-10-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec Ver Mensaje
O sea, que, mi respuesta mi mirarla siquiera.
Cita:
Empezado por dec Ver Mensaje
Hola,

A ver. Voy a tirar al aire con lo primero (y más simple, porque, de mi cerebro no pueden salir sino cosas simples) que se me ocurre. Digo que acaso el prototipo de dicha función se definió en su día con un argumento "constante". Tiempo después, por el motivo que fuese, se vió que era menester modificar dicho argumento, de manera que no valía que se dejase como constante. Si estoy en lo cierto, tal vez se tomó la solución "chapuza", esto es, utilizar una variable local para hacer las modificaciones correspondientes, manteniendo el prototipo de la función, ¡digo yo!, por razones de compatibilidad...

P.D. En efecto, esta explicación mía no puede tener sentido,... ¿verdad que no tiene sentido? Y por diversas razones además, casi estoy por borrar este mensaje...
Interesante punto de vista...



// 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
Pasar como parametro la ruta de una imagen richy08 Impresión 6 19-08-2008 22:56:00
llamar un archivo asi '192.168.1.1:\ruta\archivo.frf' IVAND Varios 5 12-04-2008 16:18:54
Ruta absoluta de un archivo Alexis De la Cr PHP 3 17-06-2006 23:41:22
ruta de un archivo ddd_ddd Varios 1 07-06-2006 23:08:34
Ruta y nombre de archivo INI jfranco Varios 2 27-02-2004 16:44:23


La franja horaria es GMT +2. Ahora son las 22:35:18.


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