none
atributos de un archivo shell32 y Windows 7 RRS feed

  • Pregunta

  • //FUNCTION: uf_file_atributo( as_filename ) -- returns String
    //uf_file_atributo("D:\audiencia\temp.mp3")

    //SCRIPT:

    String ls_path, ls_file, ls_test
    DateTime ldt_ret
    OLEObject obj_shell, obj_folder, obj_item

    obj_shell = CREATE OLEObject
    obj_shell.ConnectToNewObject( 'shell.application' )



    ls_path = Left( as_filename, LastPos( as_filename, "\" ) )
    ls_file = Mid( as_filename, LastPos( as_filename, "\" ) + 1 )

    IF FileExists( as_filename ) THEN
        obj_folder = obj_shell.NameSpace( ls_path )

        IF IsValid( obj_folder ) THEN
            obj_item = obj_folder.ParseName( ls_file )

            IF IsValid( obj_item ) THEN
                ls_test = obj_folder.GetDetailsOf( obj_item, ai_cod_atributo )
            END IF
        END IF
    END IF

    DESTROY obj_shell
    DESTROY obj_folder
    DESTROY obj_item

    RETURN ls_test

    ////////////////

    Saludos, el código que pegue lineas arriba, me es muy útil para saber el atributo de un archivo, sobre todo para saber la duración de un audio, pero me funciona en Windows XP, en Windows 7 ú 8 no me funciona, ya tengo un año tratando de solucionar este problema, por favor si algún experto pudiera ayudarme, se lo agradecería.

    Greetings, lines paste the code above, I find it very useful to know the attribute of a file, especially to know the length of an audio, but it works on Windows XP, Windows 7 or 8 does not work, and I have a year trying to solve this problem, please if some expert could help, I'd appreciate.

                      
    lunes, 4 de noviembre de 2013 22:20

Todas las respuestas

  • Comenzando con winVista (no se trata de una novedad de siete), el sistema de propiedades del shell es reemplazado.

    SHGetPropertyStoreFromParsingName() te devuelve el objeto base para obtener cualquier propiedad presente en el archivo que le pases como argumento (luego puedes consultar el valor de la propiedad System.Media.Duration / propID = 3).

    Dicho esto, la doc para el método GetDetailsOf informa que un índice de columna (-1), devolverá el texto del info tip del archivo. Normalmente el infotip de un archivo musical incluye su duración. Quizá puedas extraer ese texto usando el mismo script que con XP.

    El ejemplo es una adecuación del que se muestra en la doc del método GetDetailsOf(). Si usas el valor 27 para la columna en GetDetailsOf(), te trae la duración.

    En un form pones un botón, un textbox y un openfiledialog

    'Microsoft Shell Controls And Automation
    '/r shell32.dll   
    Imports Shell32
    Imports System.IO
    
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
    
                Dim objShell As Shell
                Dim objFolder As Folder
    
                objShell = New Shell
    
                objFolder = objShell.NameSpace(Path.GetDirectoryName(OpenFileDialog1.FileName))
    
                If (Not objFolder Is Nothing) Then
                    Dim objFolderItem As FolderItem
                    objFolderItem = objFolder.ParseName(Path.GetFileName(OpenFileDialog1.FileName))
    
                    If (Not objFolderItem Is Nothing) Then
                        Dim szItem As String
                        TextBox1.Clear()
    
                        For k As Integer = -1 To 999
                            szItem = objFolder.GetDetailsOf(objFolderItem, k)
                            If szItem = String.Empty Then Continue For
                            TextBox1.AppendText(k.ToString("#000 --> "))
                            TextBox1.AppendText(szItem)
                            TextBox1.AppendText(ControlChars.NewLine)
                        Next
                    End If
    
                    objFolderItem = Nothing
                End If
    
                objFolder = Nothing
                objShell = Nothing
    
            End If
    
        End Sub
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            TextBox1.Multiline = True
            TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
        End Sub
    End Class
    


    • Editado sopita viernes, 8 de noviembre de 2013 12:36
    miércoles, 6 de noviembre de 2013 16:43
  • Gracias por responder amigo, por fin veo luces de solución.
    miércoles, 6 de noviembre de 2013 18:37