Newsgroup: it.comp.lang.visual-basic
Titolo: Compatibilità binaria e Visual Basic 6.0

Ciao a tutti,
ho un dubbio urgentissimo che non riesco a risolvere anche dopo la
lettura del manuale di visual basic.
Ho modificato (aggiunto una sub, un componente e modificato le
dimensioni di text box) un componente ocx così strutturato:
form con le text box modificate
modulo bas dove ho aggiunto la sub
controllo utente .ctl
Quando rifaccio il setup e distribuisco al cliente non funziona perchè
il ClsID è variato giusto? Allora ho messo compatibilità binaria ma:
1. cosa devo dare come riferimento? Il vecchio ocx? o se stesso?
2. al cliente devo far deregistrare il componente (regsvr32 /u) e
registrare quello nuovo oppure rilanciare il nuovo setup senza
deregistrare nulla. Io oltre l'ocx stesso che è variato devo
consegnare anche un nuovo componente che ho incluso (chè è un ocx di
terze parti)
Grazie

 terze parti)
Sarebbe meglio fargli deregistrare la versione vecchia e registrare
quella nuova.
A meno che, naturalmente, tu non abbia a disposizione la stessa
versione dell'ocx installata sulla macchina del cliente.
In quel caso potresti impostare *quella* come file di
compatibilit� e provare a ricompilare la versione nuova.
In ogni caso, non � che una volta registrato l'ocx compilato con
la compatibilit� binaria tutti i problemi siano risolti.
Se cambi l'interfaccia pubblica del tuo componente (la firma di un metodo,
ad esempio) non potrai compilare a meno di non interrompere la
compatibilit� binaria (cosa di cui, comunque, VB ti avverte).
Altro avvertimento: quando compilerai il tuo ocx, anche se risulter� essere 
pienamente compatibile (e quindi con lo stesso CLSID), � saggio usare una
copia di *quel* file (quello compilato per ultimo) come file di
compatibilit� per la prossima compilata.
-- 
S.

 S.
Grazie mille, allora ho cercato di seguire i tuo consigli. Ecco cosa
ho fatto.
Copiato l'ocx originale dal cliente in una cartella dedicata del mio
pc
Settato compatibilità binaria al progetto modificato impostando come
riferimento l'ocx originale
Creato il pacchetto di setup
Fatto cancellare l'ocx da download object e disinstallato il progetto
originale al cliente
Lanciato il mio setup
Mi sembra tutto ok.
Approfitto della gentilezza e ti chiedo un aiuto su altri due problemi
emersi.
1. l'ocx nuovo non risultava ad un primo momento registrato. Per
ovviare ho messo come percorso predefinito nel programma di setup (uso
il package di vb) windowsys e mi sono assicurata che nel .lst ci fosse
l'opzione $(DLLSelfRegister) >> sembra risolto
2. in fase di utilizzo mi da un errore (run time error 440). L'errore
sembra causato quando il mio ocx inizializza un ocx di terze parti,
che si interfaccia con un dispositivo esterno, annegato dentro al mio
ocx >> non riesco a trovare una soluzione. L'unico modo per farlo
funzioanare sembra essere quello di far installare al cliente tutto il
pacchetto (una sorta di resource kit) comprensivo di esempi, manuali
etc... la sola installazione del dispositivo non basta!
Grazie

 etc... la sola installazione del dispositivo non basta!
Non sapendo di cosa si tratti (e anche se lo sapessi non cambierebbe
molto), provo a darti qualche consiglio forzatamente vago.
Questa specie di resource kit � quello che contiene l'ocx di terze
parti? Se s�, dovresti controllare che l'ocx sia effettivamente
redistribuibile da solo, o se necessiti invece di una qualche altra
libreria (che mi sembra l'ipotesi pi� probabile: difficile che ti
obblighino ad installare cose che all'utente finale non interessano
per niente, e il fatto che per far andare tutta la baracca tu debba
installare l'intero malloppo d� un certo sostegno a questa ipotesi).
440 � un errore di automazione piuttosto comune, che non dice poi
molto circa la condizione di errore.
Hai controllato se, in sequenza, te ne d� un altro? Se s�, magari
sul manuale dell'ocx c'� scritto qualcosa in merito.
Darei inoltre una controllatina agli esempi di utilizzo dell'ocx:
magari c'� qualche problema nell'inizializzazione del compomente, o
qualcosa del genere.
Per finire: questo problema l'hai sempre avuto o � iniziato da quando
hai impostato la compatibilit� binaria?
Hai tutta l'aria di una che ha ereditato una situazione un po' spinosa :)
-- 
S.

 S.
Ciao, grazie per l'aiuto. purtroppo nel resource kit non trovo
assolutamente della documentazione che mi aiuti
Le uniche cose sono progetti di visual basic di esempio dove il
produttore dice di registrare l'ocx e lanciare il progetto e
controllare il funzionamento. Questo ovviamente non aiuta, l'ocx è
registrato ma ovviamente il tutto è presente con il resource kit
installato quindi chi lo sa cosa si è portato dietro. Io ho copiato e
incollato tutto il codice quindi chi lo sa cosa cosa non gli piace...
Ora ho cambiato strada provando ad utilizzare la dll invece che l'ocx,
presumo faccia la stessa cosa. Mi sembra un po' più evoluta dato che
utilizza la CallWindowProc.
Ma indovina? nuovo errore. Provo a dirti cosa faccio forse tu sai la
situazione:
1. SetWindowLong(HW, GWL_WNDPROC, AddressOf NuovaWindowProc) -->
GWL_WNDPROC vale -4
2. in NuovaWindowProc testo il mio evento
  If mioMsg = WM_USER + 1 Then
    call miasub
  End If
il problema è che entra due volte miasub la prima volta correttamente
la seconda con wParam uguale a 1 e 1 è stato gestito come errore di
timeout.
Tu sai cosa è wParam nel caso in cui gestisco un messaggio
personalizzato? nel caso in cui intercetto messaggi di windows sono
parametri aggiuntivi ma in questo caso?
Grazie ancora
G

 parametri aggiuntivi ma in questo caso?
I messaggi con valore compreso tra WM_USER e non-mi-ricordo-quanto
sono riservati agli sviluppatori, servono a definire dei messaggi
personalizzati.
Posso immaginare che wParam, anche in questo caso, contenga delle
informazioni utili a gestire il messaggio che ricevi.
Sul *come* gestire un messaggio del genere... beh, naturalmente deve
essere documentato. Proprio in virt� di quanto detto sopra, WM_USER + 1
ha un significato diverso a seconda del contesto: per il controllo
con cui hai a che fare tu vuol dire una certa cosa, ma per una finestra
della classe BUTTON ne pu� voler dire tutta un'altra!
Pi� di questo non sono in grado di dirti, eccetto che, se "miasub" si
trova a venir invocata due volte, ovviamente vuol dire che il
messaggio viene spedito due volte.
Bisogna capire come gestire quel wParam = 1, se ti arriva cos� un
motivo ci dovrebbe essere.
-- 
S.