Descripcion de Archivo

Iniciado por el_chente23, 23 Agosto 2005, 18:46 PM

0 Miembros y 1 Visitante están viendo este tema.

el_chente23

Hola a todos, tengo un problema, tengo tiempo tratando de obtener  la descripcion de un archivo, esa que viene cuando el das propiedades al archivo y en la pestaña de resumen viene una serie de propiedades del archivo que necesito leer, pero ya e buscado funciones o algo para acceder a el y no he podido, intente con la funcion GetFileTitle, pero este me da la decripcion que viene en la pestaña de General de las propiedades, pero ese no me sirve, si alguien me puede ayudar se lo agradeceria.

Un Saludo

sorcerer

#1
vas a: project->project1 propietes y hay configuras todo
Las creaciones humanas son imperfectas,
por la imperfeccion de su creador

Slasher-K

El objeto App tiene todas las propiedades del programa, la descripción, versión, Nombre de la compañía, etc.

La propiedad FileDescription te da la descripción del programa en tiempo de ejecución.

Saludos.



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*

el_chente23

Hola, creo que no me explique bien, quiero obtener esa informacion pero de un archivo x, no de mi proyecto, por ejemplo, tengo un archivo txt, si le das click derecho al archivo y le das propiedades, te aparece la venta de propiedades con 4 pestañas, la ultima pestaña, que es la de resumen, es la que tiene la informacion que necesito sacar por medio de un programa en vb, espero haberme explicado mejor.

Saludos

NYlOn

mmm.... me parece haber visot un par de OCX sobre es0...
ahora no recuerdo donde xD, pero busca en (L) Google (L) q seguro encontras XDDDD
si me acuerdo edit0 y t avis0 ::D

CyA

Slasher-K

Ya me parecía que era eso :P. Hace un tiempo puse un post en donde se encontraba el código para eso. Te dejo el fragmento de código. Agrega como referencia la libería win.tlb, ya puse el link muchas veces :P.


Type FileVersionInfo
    CompanyName      As String
    FileDescription  As String
    FileVersion      As String
    InternalName     As String
    LegalCopyright   As String
    OriginalFileName As String
    ProductName      As String
    ProductVersion   As String
    Comments         As String
    FileOS           As String
End Type

Function GetVersionInfo(Filename As String) As FileVersionInfo
            Dim pFixedInfo As VS_FIXEDFILEINFO
            Dim pFileInfo As FileVersionInfo
            Dim sCharset$, btCharset(4) As Byte
            Dim lCharset&, hCharBlck&
            Dim lInfoSize&, hVersion&
            Dim sVerData$, sVerBlck$, lLen&
            Dim sVerInfo$(9), sData$, i%, r&
            Dim lBinType&
           
  lInfoSize = GetFileVersionInfoSize(Filename, 0&)
  sVerData$ = String$(lInfoSize, 0)
 
  r = GetFileVersionInfo(Filename, 0&, lInfoSize, sVerData)
 
  If r = 0 Then Exit Function
 
  r = VerQueryValue(sVerData, "\VarFileInfo\Translation", hCharBlck, lLen)
 
  If r = 0 Then Exit Function
 
  r = ReadProcessMemory(GetCurrentProcess(), hCharBlck, btCharset(1), lLen)
 
  lCharset = btCharset(3) + btCharset(4) * &H100 + _
             btCharset(1) * &H10000 + btCharset(2) * &H1000000
 
  sCharset$ = Hex$(lCharset)
  sCharset$ = String(8 - Len(sCharset$), "0") & sCharset$
 
  sVerInfo(1) = "CompanyName"
  sVerInfo(2) = "FileDescription"
  sVerInfo(3) = "FileVersion"
  sVerInfo(4) = "InternalName"
  sVerInfo(5) = "LegalCopyright"
  sVerInfo(6) = "OriginalFileName"
  sVerInfo(7) = "ProductName"
  sVerInfo(8) = "ProductVersion"
  sVerInfo(9) = "Comments"

  For i = 1 To 9
    sVerBlck$ = "\StringFileInfo\" & sCharset & "\" & sVerInfo(i)
   
    r = VerQueryValue(sVerData, sVerBlck, hVersion, lInfoSize)
   
    If r Then
      sData = String$(lInfoSize, 0)
     
      r = ReadProcessMemory(GetCurrentProcess(), hVersion, ByVal sData, lInfoSize)
     
      sData = Left$(sData, lInfoSize - 1)
     
      With GetVersionInfo
        Select Case i
          Case 1: .CompanyName = sData
          Case 2: .FileDescription = sData
          Case 3: .FileVersion = sData
          Case 4: .InternalName = sData
          Case 5: .LegalCopyright = sData
          Case 6: .OriginalFileName = sData
          Case 7: .ProductName = sData
          Case 8: .ProductVersion = sData
          Case 9: .Comments = sData
        End Select
       
        If GetBinaryType(Filename, lBinType) Then
          Select Case lBinType
            Case SCS_32BIT_BINARY: .FileOS = "Ejecutable Para Windows De 32 Bits"
            Case SCS_DOS_BINARY: .FileOS = "Ejecutable Para MS-DOS"
            Case SCS_OS216_BINARY: .FileOS = "Ejecutable Para OS/2 De 16 Bits"
            Case SCS_PIF_BINARY: .FileOS = "Acceso Directo A Programa De MS-DOS"
            Case SCS_POSIX_BINARY: .FileOS = "Archivo Ejecutable Para POSIX"
            Case SCS_WOW_BINARY: .FileOS = "Ejecutable Para Windows De 16 Bits"
            Case Else: .FileOS = "Sistema Desconocido"
          End Select
        End If

      End With
    End If
  Next
End Function


Saludos.



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*

el_chente23

Hola, probe el codigo, pero no me funciona muy bien
lInfoSize = GetFileVersionInfoSize(Filename, 0&)
sVerData$ = String$(lInfoSize, 0)

r = GetFileVersionInfo(Filename, 0&, lInfoSize, sVerData)
If r = 0 Then Exit Function


en esta parte, cuando mando llamar GetFileVersionInfoSize, siempre me devuelve 0, y cuando me devuelve distinto de 0 en la funcion GetFileVersionInfo, se cierra el programa. ¿Funciona para todos los archivos o nadamas para alguno?

Saludos

Slasher-K

A mi me funciona bien  ???. A ver probá lo siguiente:


lInfoSize = GetFileVersionInfoSize(Filename, 0&)
sVerData$ = String$(lInfoSize, 0)

r = GetFileVersionInfo(ByVal Filename, 0&, lInfoSize, ByVal sVerData)

If r = 0 Then Exit Function


Así tiene que funcionar.

Saludos.



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*

el_chente23

Hola, Gracias por la ayuda, efectivamente funciono con ese cambio, pero me salio otro, al llegar a esta linea r = VerQueryValue(sVerData, "\VarFileInfo\Translation", hCharBlck, lLen) me manda este error "No se puede encontrar el punto de entrada de la dll VerQueryValue en Version.dll", la funcion si la tengo declarada, supuse que es porque no tiene referencia a la dll especificada, la intento agregar en las referencias pero me manda este mensaje "No se puede agregar referencia al archivo especificado", ¿que tengo que hacer?, ¿estara desactualizado ese dll?.

PD: Otro detalle es que unicamente me a funcionado para archivos .exe, y los que yo necesito leer son .msi

Saludos

Slasher-K

#9
Si la declaraste con la instrucción Declare fijate de haberle puesto como Alias "VerQueryValueA", porque ese es el nombre con la que se encuentra en la DLL.


Declare Function VerQueryValue Lib "version.dll" Alias "VerQueryValueA" (.....) As Long


VERSION.DLL nunca la vas a poder agregar al proyecto porque no es un DLL ActiveX.

Saludos.

EDIT:
Los msi no son ejecutables, son bases de datos y hay un intérprete que los ejecuta. Hay otras funciones en la API para usar los MSI pero ahora no tengo tiempo, más tarde te digo cuales son porque no las recuerdo.



A la reina de las profundidades que cuida los pasos de una sombra en la noche :*