Problema con dll richiamata tra i riferimenti

di il
3 risposte

Problema con dll richiamata tra i riferimenti

Chiedo scusa se non utilizzo un linguaggio corretto, ma non sono molto esperta sull'argomento.
Provo a spiegarmi il meglio possibile.

Ho creato un progetto dll AvtiveX (Progetto1) al cui interno ho una classe (Prova). Nelle proprietà progetto, scheda Componente, imposto la compatibilità binaria con la dll che vado a creare (diciamo Progetto1.dll)
Questa dll viene richiamata tra i riferimenti di un altro progetto (Progetto2).
Fin qui tutto a posto.

Nel momento in cui faccio una modifica (tipo aggiunta di una sub) in Progetto1 e quindi ricompilo la dll, progetto2 non funziona più. Mi viene mostrato il seguente errore:
Errore di run-time '429': Il componente ActiveX non può creare l'oggetto.

Aprendo di nuovo Progetto2 e guardando i riferimenti, trovo: MANCA: Progetto1.dll
Se tolgo la spunta, chiudo i riferimenti, poi li riapro, allora ritrovo Progetto1.dll. A quel punto posso selezionarlo e quindi ricompilare Progetto2.

Quello che mi serve, è evitare di dover ricompilare Progetto2 ogni volta che modifico Progetto1.
Questo perchè nella situazione reale ho parecchi progetti che richiamano Progetto1.dll e quindi è un lavoraccio!

C'è un modo? Spero di essermi spiegata a sufficienza.

Grazie in anticipo

Patrizia

3 Risposte

  • Re: Problema con dll richiamata tra i riferimenti

    La premessa è che le DLL(Activex) usate come Componenti COM, vanno REGISTRATE e se la modifichi dovresti DEREGISTRATE la OldVersion e Registrare la NEW quindi riassegnare i Riferimenti.

    Detto questo se la DLL fosse una Standard avresti potuto usare la chiamata API "LoadLibrary"... ma con un Activex devi usare LateBinging per l'istanza del componente COM
    
    Dim tObject As Object ' late binding
    Set tObject = CreateObject([class name], [server name])
    Esempio
    
    Dim MyObj As Object
    Set MyObj = CreateObject("MyProj.MyDll")
    Il codice crera un'istanza della Classe [MyDll] che viene definita nella DLL chiamata MyProj...
    Devi sempre fare riferimento all'interfaccia COM del'oggetto.

    Ora devi sapere il Classname ed il ServerName del tuo Com Component.

    Fai attenzione che con l'istanza in LATEBINDING non puoi ereditare gli Eventi della Tua DLL(Activex) che avresti fatto con la dichiarazione [WithEvents]...
    Oppure leggiti questo:
  • Re: Problema con dll richiamata tra i riferimenti

    Dim MyObj As Object
    Set MyObj = CreateObject("MyProj.MyDll")
    Anch'io avevo provato questa soluzione.
    Però mi faceva comodo mettere la dll tra i riferimenti per poter avere direttamente visibili metodi ed eventi dell'oggetto.

    Piuttosto che modificare ogni volta i sorgenti che richiamano la dll, mi conviene fare come dici tu.


    Se posso approfittare, non so cosa significa LateBinging. Mi puoi indicare un sito dove sia spiegato qualcosa?

    Grazie

    Patrizia
  • Re: Problema con dll richiamata tra i riferimenti

    Diciamo che con VB6 puoi sfruttare la COMPILAZIONE CONDIZIONALE e, lasciare i Riferimenti con le dichiarazioni in fase di sviluppo e sfruttare l'associazione tardiva in modalità PostCompilazione...
    
    #If Condizione = True Then
        'Dichiaro Oggetti con Early Binding
        Dim xlApp As Excel.Application
        ....
    #Else
        'Dichiaro Oggetti con Late Binding
        Dim xlApp As Object
    #End If
    
    Quì trovi un'articolo di Gibra molto interessante:
    http://nuke.vbcorner.net/Articoli/VB60/EarlyLateBinding/tabid/107/Default.aspx

    Io ho scritto un TUTORIAL, è per il VBA ma concettualmente non cambia nulla... e gli esempi sono per VB6/VBA...

    http://forum.masterdrive.it/microsoft-office-access-vba-23/latebinding-vs-earlybinding-46733/
Devi accedere o registrarti per scrivere nel forum
3 risposte