Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    5

    attivare un evento dentro una DLL

    Ciao a tutti,
    ho bisogno di attivare un evento dentro una DLL scritta in VB6. La DLL é composta da un modulo class e da una form. Se l'evento é nella classe si vede senza problemi nell'applicazione che usa la DLL, ma se l'evento é dentro la form non funziona. Non é visibile o/e non scatta.
    Ho provato a definire una variabile Form di tipo WithEvents e settarla con Set Var=New Form nell'evento Class_Initialize (non essendoci il Form_Load come negli esempi che ho trovato). Niente, non va.
    Qualunque idea o suggerimento é ben accetto
    Grazie a tutti
    Niuron

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Ho provato a definire una variabile Form di tipo WithEvents e settarla con Set Var=New Form
    Cioè?
    Mostra il codice, e descrivi lo scenario.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    5
    Ciao,
    scusate se non sono stato chiaro.
    Il programma é composto da una DLL di nome clsOnCom che contiene anche una form di nome Form1 e da un'applicazione exe che richiama la DLL clsOnCom.
    Questo é il codice.

    ----------------------------------------------------------------------------
    nella classe clsOnCom della DLL:

    Public Event MyEventInClass()
    Private WithEvents mMyEventInForm As Form1

    Private Sub Class_Initialize()
    Set mMyEventInForm = New Form1
    End Sub

    Private Sub mMyEventInForm_MyEventInForm()
    RaiseEvent MyEventInClass
    End Sub

    Public Sub FireEvent() ' -------- metodo della DLL -------------
    Call Form1.FireEventInForm
    End Sub
    ----------------------------------------------------------------------------
    nella form Form1 della DLL:

    Public Event MyEventInForm()

    Public Sub FireEventInForm()
    RaiseEvent MyEventInForm
    End Sub
    ----------------------------------------------------------------------------
    nell'applicazione che usa la DLL:

    Dim WithEvents mEventInDLL As clsOnCom

    Private Sub cmdFireEvent_Click()
    mEventInDLL.FireEvent
    End Sub

    Private Sub Form_Load()
    Set mEventInDLL = New clsOnCom
    End Sub

    Private Sub mEventInDLL_MyEventInClass()
    MsgBox "fired!"
    End Sub
    ----------------------------------------------------------------------------
    Il funzionamento che mi aspetterei é questo:
    -dalla app premo il bottone FireEvent che richiama il metodo FireEvent della DLL
    -il metodo chiama FireEventInForm contenuta nel codice della Form1 (e fin qui ci siamo perché lo chiama correttamente)
    -la chiamata dovrebbe attivare l'evento della Form1 MyEventInForm (da qui i dubbi)
    -l'evento MyEventInForm dovrebbe venire trappato dalla variabile mMyEventInForm definita nella DLL a livello di classe la quale a sua volta dovrebbe attivare l'evento MyEventInClass che é visibile nella exe e che dovrebbe mostrare "Fired!".

    Io ho solo bisogno di sentire nella exe l'evento nella Form! ma ho visto che una exe che usa una DLL sente gli eventi definiti nella DLL a livello di classe, per cui ho pensato di usare lo stesso metodo fra exe e classe anche all'interno della DLL fra classe e form...
    Il risultato é nessun errore ma neanche il messaggio "Fired!", cioé l'evento nella form o non viene fatto scattare o non viene "gestito" correttamente dalla variabile mMyEventInForm ...

    Spero di aver chiarito il punto.
    Grazie per qualsiasi dritta vogliate darmi.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    5
    Trovato!

    Ho modificato il codice della classe in modo da creare un oggetto MSComm direttamente dentro la classe e ho eliminato la Form1. Così funziona: al ricevimento dalla seriale di un certo telegramma scatta l'evento OnCom dell'oggetto MSComm che fa scattare l'evento MyEventInClass "sentito" dall'applicazione che usa la DLL.

    Se vi interessa di seguito il codice della Classe (quello del exe é rimasto invariato).
    Ciao

    Dim WithEvents com As MSComm

    Public Event MyEventInClass()

    Public Sub FireEvent()
    Dim strFlush As String
    strFlush = com.Input
    com.Output = "{01" & Chr(6) & Chr(13) 'telegramma per il mio dispositivo
    End Sub

    Private Sub Class_Initialize()
    Set com = CreateObject("MSCOMMLIB.MSCOMM")
    com.CommPort = 4 'sets the comunication port number
    com.Settings = "19200,N,8,1" 'sets 19200 baud, parity even, 8 data, and 1 stop bit
    com.RTSEnable = False
    com.Handshaking = comRTS
    com.InputLen = 0
    com.RThreshold = 2
    com.PortOpen = True
    End Sub

    Private Sub Class_Terminate()
    com.PortOpen = False
    Set com = Nothing
    End Sub

    Private Sub com_OnComm()
    Dim strIn As String
    Select Case com.CommEvent
    Case comEvReceive
    strIn = com.Input
    If (strIn = Chr(35) & Chr(13)) Then 'il mio dispositivo risponde così
    RaiseEvent MyEventInClass
    End If
    End Select
    End Sub

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Prepara un progettino di esempio (zippato) che riproduca il problema e postalo su uno dei tanti siti che mettono a disposizione spazio gratuito, poi fornisci il link per scaricarlo.

    Così si va meglio a spiegarsi ed a capire.


  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    5
    Ecco il link:
    http://www.fileupyours.com/view/293990/EventsInDLL.zip

    trovate 2 applicazioni e due DLL. Una rappresenta il caso in cui l'evento non viene attivato, l'altra invece sì.
    Linkate all'applicazione la relativa DLL e provate (in realtà dovete avere un dispositivo collegato alla seriale che risponda al telegramma che inviate, io ho usato i controllori con cui lavoro per fare l'esempio...) Se no limitatevi a considerare le differenze fra i codici sorgenti.
    Penso che così sia chiaro.

    Ciao a tutti
    Niuron

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Prima di tutto ho notato che non hai messo Option Explicit da nessuna parte!
    Ti consiglio caldamente di attivare l'apposita opzione in
    Strumenti|Opzioni|Generale|Dichiarazioni di variabili obbligatoria
    in questo modo Option Explicit verrà aggiungo automaticamente ad ogni modulo che crei (frm, bas, cls).
    nei moduli esistenti invece devi aggiungerlo a mano, in testa al modulo.


    Venendo al tuo problema, l'errore sta nell'assegnazioni che fai nell'evento Initialize della classe ClassNotFiring:

    codice:
    Private Sub Class_Initialize()
        Set mMyEventInForm = New Form1
    End Sub
    Togli il New (che è di troppo) e vedrai che tutto funziona bene.


  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    5
    Grazie Gibra per i preziosi consigli, farò senz'altro come dici!
    Da non avere nessuna soluzione adesso ne ho 2!!!
    Grazie ancora
    ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.