Autor
|
Tema: Archivos .ini dentro de .exe (Leído 2,717 veces)
|
__LoG26
Desconectado
Mensajes: 1.859
Muerte: Proceso fundamental de la existencia.
|
¿Alguna forma de meter los ini dentro de las aplicaciones? Gracias de antemano Un Saludo...
|
|
|
En línea
|
Mi amigo el libro, mi signo libra, mi estilo libre. No hay balanzas que equilibren palabras de este calibre.
|
|
|
dexer
Desconectado
Mensajes: 10
|
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
|
|
|
En línea
|
|
|
|
Syphroot
Desconectado
Mensajes: 268
All You Need To Do Is Follow The Worms
|
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
|
|
|
En línea
|
|
|
|
|
Syphroot
Desconectado
Mensajes: 268
All You Need To Do Is Follow The Worms
|
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 cListaEl 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
|
|
|
En línea
|
|
|
|
|
|