Archivos .ini dentro de .exe

Iniciado por __LoG26, 25 Noviembre 2005, 03:30 AM

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

__LoG26

¿Alguna forma de meter los ini dentro de las aplicaciones?

Gracias de antemano

Un Saludo... ;D
Mi amigo el libro, mi signo libra, mi estilo libre. No hay balanzas que equilibren palabras de este calibre.


dexer

un ejemplo para empezar añades el contenido del .ini pongamos k esta en la variable ContenidoINI
para añadirlo haz un programa y pon
Open URLDelArchivo For Binary Access Read Write as #1
dim programa as string
programa = space(lof(1))
get #1,,programa
dim nPrograma as string

nsPrograma = sfff & "*INI*" & ContenidoINI & "*/INI*"
Close #1
Open URLParaElProgramaConElIni For Binary Access Read Write as #2
put #2,,nPrograma
close #2

para k se extraiga el ini correctamente pones en el programa
Open App.path & "/" & app.exename & ".exe" for binary access read as #1
Dim Datos as string
datos = space(lof(1))
get #1,,datos

i = instr(datos,1,"*INI*")
f = instr(datos,1,"*/INI*")
dim textoini as string
textoini = mid(datos,i+5,f-i+4)
Msgbox textoini o lo guardas en otro archivo como quieras
Close #1

el codigo seria mas o menos asi los instr y el mid puede k aiga k editarlos pero esk tengo sueño xD

Espero que sea eso lo que buscabas.

Salu2, Dex

Syphroot

Que bien que tocan este tema, solo una observacion y/o "truco", como quieran llamarle.

Una vez embedi en un EXE y un INI asi:

.------------,
|     EXE    |
'------------'
|    INI      |
'...............'



Bueno, resulta ser que el EXE se ejecutaba correctamente y me pregunte:

¿ Porque no leer su contenido desde el mismo EXE sin extraer el INI? (NOTA: Esto con las API's dedicadas para ello)

Y asi lo hice, PUDE leer el contenido de las secciones y claves del INI embedido, el unico problema (obvio) es escribir nuevas secciones y/o claves...

Busco el codigo y lo posteo si alguien lo requiere....


saludos

__LoG26

Si tienes un codigo sera el mejor ejemplo para ponerlo en practica. :D

Un Saludo... ;D
Mi amigo el libro, mi signo libra, mi estilo libre. No hay balanzas que equilibren palabras de este calibre.


Syphroot

El siguiente codigo va en un modulo, NO lo escribi yo, el autor es:
©Guillermo 'guille' Som, 1997-2001 <guille@costasol.net>

Ver las funciones y subs que escribió, se explica por si solo en los comentarios:





'--- Declaraciones para leer ficheros INI ---
' Leer todas las secciones de un fichero INI, esto seguramente no funciona en Win95
' Esta función no estaba en las declaraciones del API que se incluye con el VB
Public Declare Function GetPrivateProfileSectionNames Lib "kernel32" Alias "GetPrivateProfileSectionNamesA" _
    (ByVal lpszReturnBuffer As String, ByVal nSize As Long, _
    ByVal lpFileName As String) As Long

' Leer una sección completa
Public Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" _
    (ByVal lpAppName As String, ByVal lpReturnedString As String, _
    ByVal nSize As Long, ByVal lpFileName As String) As Long

' Leer una clave de un fichero INI
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
    (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _
     ByVal lpDefault As String, ByVal lpReturnedString As String, _
     ByVal nSize As Long, ByVal lpFileName As String) As Long

' Escribir una clave de un fichero INI (también para borrar claves y secciones)
Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
    (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _
     ByVal lpString As Any, ByVal lpFileName As String) As Long

Public Sub IniDeleteKey(ByVal sIniFile As String, ByVal sSection As String, _
                        Optional ByVal sKey As String = "")
    '--------------------------------------------------------------------------
    ' Borrar una clave o entrada de un fichero INI                  (16/Feb/99)
    ' Si no se indica sKey, se borrará la sección indicada en sSection
    ' En otro caso, se supone que es la entrada (clave) lo que se quiere borrar
    '
    ' Para borrar una sección se debería usar IniDeleteSection
    '
    If Len(sKey) = 0 Then
        ' Borrar una sección
        Call WritePrivateProfileString(sSection, 0&, 0&, sIniFile)
    Else
        ' Borrar una entrada
        Call WritePrivateProfileString(sSection, sKey, 0&, sIniFile)
    End If
End Sub

Public Sub IniDeleteSection(ByVal sIniFile As String, ByVal sSection As String)
    '--------------------------------------------------------------------------
    ' Borrar una sección de un fichero INI                          (04/Abr/01)
    ' Borrar una sección
    Call WritePrivateProfileString(sSection, 0&, 0&, sIniFile)
End Sub

Public Function IniGet(ByVal sFileName As String, ByVal sSection As String, _
                       ByVal sKeyName As String, _
                       Optional ByVal sDefault As String = "") As String
    '--------------------------------------------------------------------------
    ' Devuelve el valor de una clave de un fichero INI
    ' Los parámetros son:
    '   sFileName   El fichero INI
    '   sSection    La sección de la que se quiere leer
    '   sKeyName    Clave
    '   sDefault    Valor opcional que devolverá si no se encuentra la clave
    '--------------------------------------------------------------------------
    Dim ret As Long
    Dim sRetVal As String
    '
    sRetVal = String$(255, 0)
    '
    ret = GetPrivateProfileString(sSection, sKeyName, sDefault, sRetVal, Len(sRetVal), sFileName)
    If ret = 0 Then
        IniGet = sDefault
    Else
        IniGet = Left$(sRetVal, ret)
    End If
End Function

Public Sub IniWrite(ByVal sFileName As String, ByVal sSection As String, _
                    ByVal sKeyName As String, ByVal sValue As String)
    '--------------------------------------------------------------------------
    ' Guarda los datos de configuración
    ' Los parámetros son los mismos que en LeerIni
    ' Siendo sValue el valor a guardar
    '
    Call WritePrivateProfileString(sSection, sKeyName, sValue, sFileName)
End Sub

Public Function IniGetSection(ByVal sFileName As String, _
                              ByVal sSection As String) As String()
    '--------------------------------------------------------------------------
    ' Lee una sección entera de un fichero INI                      (27/Feb/99)
    ' Adaptada para devolver un array de string                     (04/Abr/01)
    '
    ' Esta función devolverá un array de índice cero
    ' con las claves y valores de la sección
    '
    ' Parámetros de entrada:
    '   sFileName   Nombre del fichero INI
    '   sSection    Nombre de la sección a leer
    ' Devuelve:
    '   Un array con el nombre de la clave y el valor
    '   Para leer los datos:
    '       For i = 0 To UBound(elArray) -1 Step 2
    '           sClave = elArray(i)
    '           sValor = elArray(i+1)
    '       Next
    '
    Dim i As Long
    Dim j As Long
    Dim sTmp As String
    Dim sClave As String
    Dim sValor As String
    '
    Dim aSeccion() As String
    Dim n As Long
    '
    ReDim aSeccion(0)
    '
    ' El tamaño máximo para Windows 95
    sBuffer = String$(32767, Chr$(0))
    '
    n = GetPrivateProfileSection(sSection, sBuffer, Len(sBuffer), sFileName)
    '
    If n Then
        '
        ' Cortar la cadena al número de caracteres devueltos
        sBuffer = Left$(sBuffer, n)
        ' Quitar los vbNullChar extras del final
        i = InStr(sBuffer, vbNullChar & vbNullChar)
        If i Then
            sBuffer = Left$(sBuffer, i - 1)
        End If
        '
        n = -1
        ' Cada una de las entradas estará separada por un Chr$(0)
        Do
            i = InStr(sBuffer, Chr$(0))
            If i Then
                sTmp = LTrim$(Left$(sBuffer, i - 1))
                If Len(sTmp) Then
                    ' Comprobar si tiene el signo igual
                    j = InStr(sTmp, "=")
                    If j Then
                        sClave = Left$(sTmp, j - 1)
                        sValor = LTrim$(Mid$(sTmp, j + 1))
                        '
                        n = n + 2
                        ReDim Preserve aSeccion(n)
                        aSeccion(n - 1) = sClave
                        aSeccion(n) = sValor
                    End If
                End If
                sBuffer = Mid$(sBuffer, i + 1)
            End If
        Loop While i
        If Len(sBuffer) Then
            j = InStr(sBuffer, "=")
            If j Then
                sClave = Left$(sBuffer, j - 1)
                sValor = LTrim$(Mid$(sBuffer, j + 1))
                n = n + 2
                ReDim Preserve aSeccion(n)
                aSeccion(n - 1) = sClave
                aSeccion(n) = sValor
            End If
        End If
    End If
    ' Devolver el array
    IniGetSection = aSeccion
End Function

Public Function IniGetSections(ByVal sFileName As String) As String()
    '--------------------------------------------------------------------------
    ' Devuelve todas las secciones de un fichero INI                (27/Feb/99)
    ' Adaptada para devolver un array de string                     (04/Abr/01)
    '
    ' Esta función devolverá un array con todas las secciones del fichero
    '
    ' Parámetros de entrada:
    '   sFileName   Nombre del fichero INI
    ' Devuelve:
    '   Un array con todos los nombres de las secciones
    '   La primera sección estará en el elemento 1,
    '   por tanto, si el array contiene cero elementos es que no hay secciones
    '
    Dim i As Long
    Dim sTmp As String
    Dim n As Long
    Dim aSections() As String
    '
    ReDim aSections(0)
    '
    ' El tamaño máximo para Windows 95
    sBuffer = String$(32767, Chr$(0))
    '
    ' Esta función del API no está definida en el fichero TXT
    n = GetPrivateProfileSectionNames(sBuffer, Len(sBuffer), sFileName)
    '
    If n Then
        ' Cortar la cadena al número de caracteres devueltos
        sBuffer = Left$(sBuffer, n)
        ' Quitar los vbNullChar extras del final
        i = InStr(sBuffer, vbNullChar & vbNullChar)
        If i Then
            sBuffer = Left$(sBuffer, i - 1)
        End If
        '
        n = 0
        ' Cada una de las entradas estará separada por un Chr$(0)
        Do
            i = InStr(sBuffer, Chr$(0))
            If i Then
                sTmp = LTrim$(Left$(sBuffer, i - 1))
                If Len(sTmp) Then
                    n = n + 1
                    ReDim Preserve aSections(n)
                    aSections(n) = sTmp
                End If
                sBuffer = Mid$(sBuffer, i + 1)
            End If
        Loop While i
        If Len(sBuffer) Then
            n = n + 1
            ReDim Preserve aSections(n)
            aSections(n) = sBuffer
        End If
    End If
    ' Devolver el array
    IniGetSections = aSections
End Function

Public Function AppPath(Optional ByVal ConBackSlash As Boolean = True) As String
    ' Devuelve el path del ejecutable                               (23/Abr/02)
    ' con o sin la barra de directorios
    Dim s As String
    '
    s = App.Path
    If ConBackSlash Then
        If Right$(s, 1) <> "\" Then
            s = s & "\"
        End If
    Else
        If Right$(s, 1) = "\" Then
            s = Left$(s, Len(s) - 1)
        End If
    End If
    AppPath = s
End Function
'------------------------------------------------------------------------------
' Fin del código para acceder a los ficheros INIs
'------------------------------------------------------------------------------




Para usar algunas funciones veamos el siguiente codigo:



Dim sFichero as string, Temp As String, i As Long, tValores() As String

sFichero = App.Path & "\" & App.EXEName & ".exe"
           
           'obtiene todas las llaves y lo mete en el array
            tValores = IniGetSection(sFichero, "Lista")
               
                If UBound(tValores) > 0 Then
               
                       For i = 0 To UBound(tValores) Step 2
                            'Lee los valores
                            Temp = IniGet(sFichero, "Lista", tValores(i))
                            Temp = Trim(Temp) 'Le quita los espacios
                           
                            If Len(Temp) > 0 Then
                                cLista.AddItem Temp
                            End If
                       
                       Next
                               
                End If



El codigo anterior saca los valores de las llaves de la sección "Lista" y las mete en el ListBox llamado cLista

El INI embedido puede paracerse a esto:

[Lista]
key1=valor1
key2=valor2
.
.
.
keyN=valorN


Checa las demas funciones del modulo, algunas obtienen Todas las secciones, otras borran secciones,otras borran llaves,etc.

Si no quedo claro el codigo, postea.

saludos