elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Cambiar Icono de Aplicación en tiempo de ejecución
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Cambiar Icono de Aplicación en tiempo de ejecución  (Leído 5,512 veces)
.Slasher-K.

Desconectado Desconectado

Mensajes: 79


Ver Perfil
Cambiar Icono de Aplicación en tiempo de ejecución
« en: 8 Marzo 2006, 20:39 pm »

A pedido de KiZar me puse a investigar y logré escribir un code que funciona tanto en Win9X como en Win2K y demás.

El problema erradicaba en los datos que había que ingresar en el ejecutable, no tanto en la llamada a UpdateResource. Así que escribí una función que extrae los datos crudos de un archivo de ícono (*.ico), o sea, la imagen en sí, de esta manera ya funciona perfectamente.

Módulo basChangeRes.bas

Código:
'
'Coded by Slasher-K
'
Public Declare Function BeginUpdateResource Lib "unicows.dll" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Public Declare Function UpdateResource Lib "unicows.dll" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Public Declare Function EndUpdateResource Lib "unicows.dll" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long


Function ChangeIcon(Filename As String, IconFilename As String) As Boolean
  On Error GoTo ErrRes
 
        Dim hRes&, r&
        Dim btData() As Byte
 
  hRes = BeginUpdateResource(Filename, False)
 
  If hRes = 0 Then
    Debug.Print "No se pudo abrir el archivo"
   
    Exit Function
  End If

  btData = GetIconData(IconFilename)
  r = UpdateResource(hRes, RT_ICON, 1, 3082, btData(0), UBound(btData))

ErrRes:
  r = EndUpdateResource(hRes, False)
End Function


Módulo basIcons.bas

Código:
'
'Coded by Slasher-K
'

Option Explicit

Type ICONDIRENTRY
  bWidth        As Byte     '  Ancho, en píxeles, de la imagen.
  bHeight       As Byte     '  Alto, en píxeles, de la imagen.
  bColorCount   As Byte     '  Número de colores en la imagen (0 si >=8bpp).
  bReserved     As Byte     '  Reservado ( debe ser 0).
  wPlanes       As Integer  '  Color Planes.
  wBitCount     As Integer  '  Bits por pixel.
  dwBytesInRes  As Long     '  Bytes in the resource.
  dwImageOffset As Long     '  Puntero a los datos en el archivo.
End Type

Type ICONDIR
  idReserved  As Integer
  idType      As Integer
  idCount     As Integer
End Type

Function GetIconData(IcoFile As String, Optional IconIndex As Integer) As Byte()
  On Error Resume Next
 
     
      Dim lpIconDir   As ICONDIR
      Dim lpIconEntry As ICONDIRENTRY
      Dim btData()    As Byte
      Dim lOffset&, iCnt%
      Dim hFile%, i%

  hFile = FreeFile
 
  Open IcoFile For Binary As #hFile
 
  Get #hFile, 1, lpIconDir
 
  With lpIconDir
    lOffset = Len(lpIconDir) + 1
   
    If (IconIndex > .idCount) Or (IconIndex < 1) Then IconIndex = 1
   
    For i = 1 To .idCount
      Get #hFile, lOffset, lpIconEntry
     
      If i = IconIndex Then
        ReDim btData(lpIconEntry.dwBytesInRes) As Byte
       
        Get #hFile, lpIconEntry.dwImageOffset + 1, btData
       
        GetIconData = btData
       
        Exit For
      End If
     
      lOffset = lOffset + Len(lpIconEntry)
    Next
   
  End With
 
ErrRead:
  Close #hFile
End Function


En línea

Kizar


Desconectado Desconectado

Mensajes: 1.325


kizar_net


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #1 en: 8 Marzo 2006, 21:31 pm »

RT_ICON = ¿?
Salu2


En línea

.Slasher-K.

Desconectado Desconectado

Mensajes: 79


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #2 en: 8 Marzo 2006, 21:34 pm »

RT_ICON = 3

Declarada en win.tlb
En línea

Kizar


Desconectado Desconectado

Mensajes: 1.325


kizar_net


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #3 en: 8 Marzo 2006, 21:44 pm »

Yo tengo windows XP y pongo:
Código:
Private Sub Form_Load()
ChangeIcon "C:\f.exe", "C:\a.ico"
End Sub

Y el programa se cuelga y deja el exe como esta sin cambiar el icono....
En línea

.Slasher-K.

Desconectado Desconectado

Mensajes: 79


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #4 en: 8 Marzo 2006, 21:58 pm »

Bajate unicows.dll y copiala al direcotorio del sistema, si no funciona cambia las declaraciones para usar las de kernel32.dll.

Descargar unicows.dll

Saludos.
En línea

Kizar


Desconectado Desconectado

Mensajes: 1.325


kizar_net


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #5 en: 8 Marzo 2006, 22:11 pm »

Ya la tenia instalada de antes, pero el problema no es ese, el problema es que da un fallo de windows que pone que:
"La aplicacion ha provocado un error y debe ser cerrada..."

Ya es tarde aqui , mañana busco informacion sobre el uso de esas apis y algun ejemplo, aunke hay poca cosa en internet....

Salu2
En línea

.Slasher-K.

Desconectado Desconectado

Mensajes: 79


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #6 en: 8 Marzo 2006, 22:17 pm »

El problema está en que Windows 9x no implementa esas llamadas porque son funciones Unicode, por eso hay que usar la otra librería (unicows.dll), en cambio Windows NT/2k sí, por lo que se pueden usar tranquilamente las funciones de kernel32.dll, pero las Unicode, o sea, BeginUpdateResourceW, etc.

Por eso lo que se puede hacer es verificar qué sistema es y usar distintas llamadas dependiendo de la versión. Dejo el code modificado para que sea independiente del SO.

Código:
Public Declare Function BeginUpdateResource9x Lib "unicows.dll" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Public Declare Function UpdateResource9x Lib "unicows.dll" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Public Declare Function EndUpdateResource9x Lib "unicows.dll" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long

Public Declare Function BeginUpdateResourceNT Lib "kernel32" Alias "BeginUpdateResourceW" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Public Declare Function UpdateResourceNT Lib "kernel32" Alias "UpdateResourceW" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Public Declare Function EndUpdateResourceNT Lib "kernel32" Alias "EndUpdateResourceW" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long

Function ChangeIcon(Filename As String, IconFilename As String) As Boolean
  On Error GoTo ErrRes
 
        Dim hRes&, r&
        Dim btData() As Byte
 
  If IsWin9x Then
    hRes = BeginUpdateResource9x(Filename, False)
  Else
    hRes = BeginUpdateResourceNT(Filename, False)
  End If
 
  If hRes = 0 Then
    Debug.Print "No se pudo abrir el archivo"
   
    Exit Function
  End If

  btData = GetIconData(IconFilename)
 
  If IsWin9x Then
    r = UpdateResource9x(hRes, RT_ICON, 1, 3082, btData(0), UBound(btData))
  Else
    r = UpdateResourceNT(hRes, RT_ICON, 1, 3082, btData(0), UBound(btData))
  End If
 
ErrRes:
  If IsWin9x Then
    r = EndUpdateResource9x(hRes, False)
  Else
    r = EndUpdateResourceNT(hRes, False)
  End If
End Function

Function IsWin9x() As Boolean
      Dim lpVerInfo As OSVERSIONINFO
      Dim r&

  lpVerInfo.dwOSVersionInfoSize = Len(lpVerInfo)
 
  r = GetVersionEx(lpVerInfo)
  IsWin9x = (lpVerInfo.dwPlatformId = 1)
End Function

Eso debería funcionar. A mi en win9x me funciona perfecto. Y por inet no vas a encontrar mucho ni menos código, te lo aseguro :P.
En línea

Kizar


Desconectado Desconectado

Mensajes: 1.325


kizar_net


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #7 en: 8 Marzo 2006, 22:51 pm »

Eso debería funcionar. A mi en win9x me funciona perfecto. Y por inet no vas a encontrar mucho ni menos código, te lo aseguro :P.

Encontre algo, pero en frances y era muy largo el code, porl o menos ahora ya no da el error, pero no cambia el icono. (llorar)

Mañana mirare a ver lo que pasa.
En línea

.Slasher-K.

Desconectado Desconectado

Mensajes: 79


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #8 en: 8 Marzo 2006, 22:54 pm »

¿A ver, pero cómo lo llamas?

El argumento IconFilename tiene que ser un archivo *.ico. Probando en XP (gracias Crack_X ;D), me di cuenta que las llamadas unicode no funcionan, tienen que ser las Ansi

Código:
Public Declare Function BeginUpdateResourceNT Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Public Declare Function UpdateResourceNT Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Public Declare Function EndUpdateResourceNT Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
En línea

Kizar


Desconectado Desconectado

Mensajes: 1.325


kizar_net


Ver Perfil
Re: Cambiar Icono de Aplicación en tiempo de ejecución
« Respuesta #9 en: 8 Marzo 2006, 23:03 pm »

Código:
Private Sub Form_Load()
ChangeIcon "C:\f.exe", "C:\a.ico"
End Sub

Salu2
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como puedo cambiar propiedades de objetos en tiempo de ejecucion leyendo un txt.
Programación Visual Basic
3m1 1 3,478 Último mensaje 15 Febrero 2011, 14:47 pm
por 79137913
Icono aplicacion C#
.NET (C#, VB.NET, ASP)
BlackDawn 2 6,101 Último mensaje 8 Junio 2011, 21:27 pm
por [D4N93R]
como cambiar icono de EXE en ejecucion?
Programación Visual Basic
x64core 7 7,923 Último mensaje 15 Julio 2011, 01:51 am
por raul338
Una aplicación para cambiar de tarifa
Noticias
wolfbcn 0 1,344 Último mensaje 31 Julio 2011, 02:36 am
por wolfbcn
Aplicacion en swing para mostrar el tiempo de provincias y poblaciones
Java
kikian94 2 1,966 Último mensaje 16 Abril 2015, 10:12 am
por kikian94
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines