Autor
|
Tema: Cambiar Icono de Aplicación en tiempo de ejecución (Leído 7,546 veces)
|
.Slasher-K.
Desconectado
Mensajes: 79
|
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' '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' '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
Mensajes: 1.325
kizar_net
|
RT_ICON = ¿? Salu2
|
|
|
En línea
|
|
|
|
.Slasher-K.
Desconectado
Mensajes: 79
|
RT_ICON = 3
Declarada en win.tlb
|
|
|
En línea
|
|
|
|
Kizar
Desconectado
Mensajes: 1.325
kizar_net
|
Yo tengo windows XP y pongo: 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
Mensajes: 79
|
Bajate unicows.dll y copiala al direcotorio del sistema, si no funciona cambia las declaraciones para usar las de kernel32.dll. Descargar unicows.dllSaludos.
|
|
|
En línea
|
|
|
|
Kizar
Desconectado
Mensajes: 1.325
kizar_net
|
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
Mensajes: 79
|
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. 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 .
|
|
|
En línea
|
|
|
|
Kizar
Desconectado
Mensajes: 1.325
kizar_net
|
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 . 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
Mensajes: 79
|
¿A ver, pero cómo lo llamas? El argumento IconFilename tiene que ser un archivo *.ico. Probando en XP (gracias Crack_X ), me di cuenta que las llamadas unicode no funcionan, tienen que ser las Ansi 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
Mensajes: 1.325
kizar_net
|
Private Sub Form_Load() ChangeIcon "C:\f.exe", "C:\a.ico" End Sub Salu2
|
|
|
En línea
|
|
|
|
|
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
|
4,381
|
15 Febrero 2011, 14:47 pm
por 79137913
|
|
|
Icono aplicacion C#
.NET (C#, VB.NET, ASP)
|
BlackDawn
|
2
|
7,039
|
8 Junio 2011, 21:27 pm
por [D4N93R]
|
|
|
como cambiar icono de EXE en ejecucion?
Programación Visual Basic
|
x64core
|
7
|
9,295
|
15 Julio 2011, 01:51 am
por raul338
|
|
|
Una aplicación para cambiar de tarifa
Noticias
|
wolfbcn
|
0
|
2,078
|
31 Julio 2011, 02:36 am
por wolfbcn
|
|
|
Aplicacion en swing para mostrar el tiempo de provincias y poblaciones
Java
|
kikian94
|
2
|
2,686
|
16 Abril 2015, 10:12 am
por kikian94
|
|