Newsgroup: it.comp.lang.visual-basic
Titolo: API LoadIcon(), non mi funziona !?

Ciao a tutti.
Sto tentando di avere l'handle dell'icona associata all'instance della mia
applicazione (VB5SP3), utilizzando la funzione API LoadIcon().
Solo che mi ritorna sempre 0 (errore), persino se la uso per prendere
l'handle di un'icona di sistema:
LoadIcon(vbNull, IDI_QUESTION)
Ho provato anche modificando la Declare (mettendo il secondo parametro come
byref, Long, ...) ma NIENTE!
Mi serve per mettere l'icona in una About Box, senza dover specificare la
form da cui prendere l'icona stessa. Poiche' l'oggetto App non ha una
proprieta' Icon, mi tocca usare le API... oppure c'e' un altro modo?
TIA
--
Roal Zanazzi
z...@iol.it

Non ho ben capito il tuo problema, il fatto che LoadIcon non funzionase mi
ha incuriosito e ho fatto alcune prove.
Non usare vbNull ma 0& e modifica la declare come segue:
Questo esempio, non ritorna zero (non ti assicuro che sia effettiavamente
l'handle dell icona)
----------------------------------------------------------------------------
-------------------------------
Option Explicit
Private Declare Function LoadIconBynum& Lib "user32" Alias "LoadIconA"
(ByVal hInstance As Long, ByVal lpIconName As Long)
Const IDI_QUESTION = 32514&
Private Sub Command1_Click()
Debug.Print LoadIconBynum(0&, IDI_QUESTION)
End Sub
----------------------------------------------------------------------------
-------------------------------
La butto lě...perchč non carichi l'icona da un file di risorse?
Ciao,
Corrado

...

La LoadIcon() puoi usarla così:
hIcon = LoadIcon(0&, IconType)
dove IconType è appunto un tipo delle IDI_*.
Quando leggi che va passato null come parametro di un'api in realtà con VB
devi passare 0&, cioè il puntatore a null, e non Null o vbNull.
Però LoadIcon non mi sembra che riesca a restituirti l'icona della tua App.
(purtroppo), ma solo l'icona che rappresenta una finestra windows.
Ho scoperto casualmente che le icone restituite da LoadIcon() sono le stesse
contenute in User32.dll.
Quindi LoadIcon() equivale  a ExtractIcon e simili, puntando a "User32.dll".
Ciao.

l'handle dell icona)
<snip>
OK, questo funziona.
Purtroppo pero' a me serve l'altro utilizzo dell'API LoadIcon(), ossia NON
per avere l'handle di un'icona di sistema (primo parametro = NULL),
ma di avere l'handle dell'icona della mia applicazione (passando
App.HInstance come primo parametro).
Quello che avrei intenzione di fare (come ho gia' scritto) e' fare una form
di About ASSOLUTAMENTE generica, che sia in grado di visualizzare l'icona
dell'applicazione SENZA doverle specificare il nome della form in cui c'e'
l'icona.
Se l'oggetto App avesse una proprieta' Icon, con l'icona assegnata al
progetto non ci sarebbero problemi e userei quella; purtroppo non e' cosi' e
sto cercando un modo per trovare l'icona dell'applicazione.
La tua soluzione e' corretta, usando la Declare cosi'
Private Declare Function LoadIconByNum Lib "user32" Alias "LoadIconA" (ByVal
hInstance As Long, ByVal lpIconName As Long) As Long
e chiamando l'API con:
LoadIconByNum(App.HInstance, 1&)
(l'ID numerico dell'icona e' 1 per l'icona principale in VB)
Pero' ho scoperto che funziona SOLO con l'EXE compilato, mentre
nell'ambiente VB non funzia. Infatti nella documentazione dell'API LoadIcon
c'e' scritto:
"The LoadIcon function loads the specified icon resource from the executable
(.EXE) file associated with an application instance. "
Quindi e' comunque necessario avere l'EXE (problema che mi aveva fatto
scartare l'uso dell'API ExtractIcon()).
Possibile che non ci sia un modo per avere l'icona del progetto ANCHE dentro
l'ambiente VB?
Va beh, comunque per ora lo lascio cosi', con la nota che l'icona e'
visualizzata solo a run-time.
--
Roal Zanazzi
z...@iol.it

l'ambiente VB?
[...]
Secondo me la soluzione migliore e' usare l'API ExtractIconEx() e passare
come argomento App.Path & "\" & App.ExeName
E puoi usarla benissimo all'interno di vb, basta che ti compili una volta
l'exe tanto per averlo li'.