Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Compatibilità binaria e Visual Basic 6.0

104 views
Skip to first unread message

g

unread,
Jan 8, 2010, 4:15:57 AM1/8/10
to
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

Stevie

unread,
Jan 8, 2010, 4:31:59 PM1/8/10
to
On 08/01/2010 10.15, g wrote:

> Quando rifaccio il setup e distribuisco al cliente non funziona perch�
> il ClsID � variato giusto?

Esatto.

> Allora ho messo compatibilit� binaria ma:


> 1. cosa devo dare come riferimento? Il vecchio ocx? o se stesso?

L'ocx di riferimento deve essere in un percorso diverso da dove lo
compili normalmente.
Se usi l'ocx stesso non riesci a compilare.

> 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)

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.

g

unread,
Jan 11, 2010, 6:25:41 AM1/11/10
to
On 8 Gen, 22:31, Stevie <jstevie__@__gmail__.com> wrote:
> On 08/01/2010 10.15, g wrote:
>
> > Quando rifaccio il setup e distribuisco al cliente non funziona perchè
> > il ClsID è variato giusto?
>
> Esatto.
>
> > Allora ho messo compatibilità binaria ma:

> > 1. cosa devo dare come riferimento? Il vecchio ocx? o se stesso?
>
> L'ocx di riferimento deve essere in un percorso diverso da dove lo
> compili normalmente.
> Se usi l'ocx stesso non riesci a compilare.
>
> > 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)
>
> 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.

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

Stevie

unread,
Jan 11, 2010, 12:38:56 PM1/11/10
to
On 11/01/2010 12.25, g wrote:

> 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

Non saprei dirti perch�. In pi� non ho mai usato l'IDE di VB per creare
setup, dove lavoro utilizziamo l'accoppiata InnoSetup + ISTool
(che ti consiglio vivamente di provare).

> 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!

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.

g

unread,
Jan 12, 2010, 11:22:27 AM1/12/10
to
On 11 Gen, 18:38, Stevie <jstevie__@__gmail__.com> wrote:
> On 11/01/2010 12.25, g wrote:
>
> > 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
>
> Non saprei dirti perché. In più non ho mai usato l'IDE di VB per creare

> setup, dove lavoro utilizziamo l'accoppiata InnoSetup + ISTool
> (che ti consiglio vivamente di provare).
>
> > 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!
>
> 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.

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

Stevie

unread,
Jan 12, 2010, 1:48:50 PM1/12/10
to
On 12/01/2010 17.22, g wrote:

> Ciao, grazie per l'aiuto. purtroppo nel resource kit non trovo
> assolutamente della documentazione che mi aiuti

[snip]

> 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.

Presumi? Potrebbe non essere una buona idea.
Non c'� scritto nemmeno questo sulla documentazione?

> 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?

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.

0 new messages