Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Limiti utilizzo DLL create con VB6

    Salve, spero di esprimermi nel modo più chiaro ed esaustivo possibile.
    Mi sono cimentato nella programmazione in VB6 di una applicazione EXE che sfruttasse il codice contenuto in delle librerie DLL da me create.
    La creazione delle DLL (non Activex) l'ho effettuata modificando il compilatore di Visual Basic nel modo decritto in alcuni articoli presenti su internet in merito all'argomento. La creazione va a buon fine e l'utilizzo delle mie librerie è perfetto nella modalità debug, ossia ad applicazione non compilata . Nel momento in cui invece compilo l'applicazione, nelle operazioni che utilizzano le librerie, essa si blocca ed esce la schermata classica del problema:
    "Si è verificato un errore in ... . L'applicazione verrà chiusa. Inviare?".
    Le funzioni incluse nella DLL utilizzano degli input double e variant, mentre come output hanno delle matrici di variabili type da me definite. Questi output li passo alle funzioni come argomenti della funzione ma in "Byref", mentre il valore della funzione è booleano e mi riporta esclusivamente l'esito della operazione:
    Public Declare Function TraRettilineo Lib "Geometria.dll" (ByVal Lunghezza As Double, ByVal Passo As Double, ByRef MaTemp() As Coord) As Boolean
    Public Type Coord
    s As Double
    x As Double
    y As Double
    z As Double
    t As Double
    End Type

    La dichiarazione del type chiaramente l'ho effettuata sia nel progetto della DLL che in quello dell'applicazione; ribadisco che il sistema funziona perfettamente in modalità debug.
    Il dubbio che mi sopraggiunge è questo, è possibile che la memoria destinata a questo scopo a programma compilato sia minore che nella fase di debug, o che sopraggiunga qualche limitazione intrinseca a me ignota??
    Sono costretto a caricare il codice delle DLL come moduli BAS perdendo così la possibilità di "nascondere" il codice anche ad applicazione non compilata?
    Spero di essermi espresso chiaramente.
    Ringrazio chiunque voglia rispondermi.
    Michele

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: Limiti utilizzo DLL create con VB6

    Originariamente inviato da Nostradamus123
    La creazione delle DLL (non Activex) l'ho effettuata modificando il compilatore di Visual Basic nel modo decritto in alcuni articoli presenti su internet in merito all'argomento.
    Quali articoli?

    "Si è verificato un errore in ... . L'applicazione verrà chiusa. Inviare?"
    Sei riuscito a capire qual e' la funzione che scatena l'errore?

    La dichiarazione del type chiaramente l'ho effettuata sia nel progetto della DLL che in quello dell'applicazione
    Ci fai vedere queste dichiarazioni, il codice chiamante e il codice chiamato?

  3. #3
    Grazie per avermi risposto così solertemente.
    Dunque, l'articolo nel quale ho letto delle indicazioni con le quali effettuare le DLL e:
    http://www.vbasic.it/articoli/agDllByVB.htm

    Dopo aver scritto l'email ho effettuato differenti prove nelle quali ho notato che l'applicazione si blocca dopo diverse chiamate alla libreria, mi spiego meglio. Il mio software crea una successione di coordinate spaziali a ottenute tramite l'assemblamento di sotto successioni di coordinate spaziali locali. Queste ultime le ottengo dalle DLL da me fatte. Con ciascuna funzione ottengo la matrice Temporanea MaTemp che è un type da me definito sia nella DLL che nel progetto madre. In totale chiama la DLL una 50 di volte tramite un ciclo. Ho posizionato una MSGBOX(cstr(i)) per evidenziare il momento oltre il quale va in crash,ma sembra del tutto aleatorio. Tendenzialmente si blocca dopo una quindicina di chiamate. Questo in qualche modo mi dimostra che per 15 volte la chiamata ha buon esito, ma poi qualcosa va storto. :master:

    Porto qualche stralcio di codice:
    CODICE APPLICAZIONE
    In un modulo dichiaro
    Public Declare Function TraRettilineo Lib "Geometria.dll" (ByVal Lunghezza As Double, ByVal Passo As Double, ByRef MaTemp() As Coord) As Boolean
    Public Declare Function TraArco Lib "Geometria.dll" (ByVal Raggio As Double, ByVal Alfa As Double, ByVal Passo As Double, ByRef MaTemp() As Coord) As Boolean
    Public Declare Function TraMultiParametro Lib "Geometria.dll" (ByVal n As Double, ByVal A As Double, ByVal Ri As Variant, ByVal Rf As Variant, ByVal Passo As Double, ByRef MaTemp() As Coord) As Boolean

    Public Type Coord
    s As Double
    x As Double
    y As Double
    z As Double
    t As Double
    End Type

    Dim MaTemp() As Coord

    Public sub CreaAsse
    For Ele = 1 To UBound(E_T, 1)
    Select Case E_T(Ele, 1)
    Case "R": finto = TraRettilineo(CDbl(E_T(Ele, 2)), CDbl(E_T(Ele, 0)), MaTemp)
    Case "M": finto = TraMultiParametro(CDbl(E_T(Ele, 2)), CDbl(E_T(Ele, 3)), _
    E_T(Ele,4), E_T(Ele, 5), CDbl(E_T(Ele, 0)), MaTemp)
    Case "A": finto = TraArco(CDbl(E_T(Ele, 2)), CDbl(E_T(Ele, 3)), CDbl(E_T(Ele, 0)), MaTemp)
    End Select
    ...
    Qui processo ed assemblo la matrice MaTemp aggiungendo i valori in calce ad una matrice dichiarata come pubblica
    ...
    next Ele
    ...
    End Sub


    CODICE DLL
    Nel modulo
    Option Explicit
    Private Sub Main()
    End Sub
    Public Function TraRettilineo(ByVal Lunghezza As Double, ByVal Passo As Double, ByRef MaTemp() As Coord) As Boolean 'OK
    Dim ixi As Long, n_Step As Double
    n_Step = Int(Lunghezza / Passo)
    ReDim MaTemp(n_Step)
    For ixi = 0 To n_Step
    MaTemp(ixi).x = ixi * Passo
    MaTemp(ixi).y = 0
    MaTemp(ixi).z = 0
    MaTemp(ixi).s = ixi * Passo
    Next ixi
    If ((Lunghezza / Passo) - n_Step) > 0.0000000000001 Then
    ReDim Preserve MaTemp(n_Step + 1)
    MaTemp(n_Step + 1).x = Lunghezza
    MaTemp(n_Step + 1).y = 0
    MaTemp(n_Step + 1).s = Lunghezza
    End If
    MaTemp(UBound(MaTemp)).z = 0 'Valore che indica l'angolo di rotazione dell'elemento successivo, verrà sovrascritto dalle z
    TraRettilineo = True
    End Function

    In una classe
    Public Type Coord
    s As Double
    x As Double
    y As Double
    z As Double
    End Type


    No saprei proprio cosa altro aggiungere, rischierei di essere troppo prolisso. Spero di aver illustrato la cosa...
    Mi riserbo di provare a verificare se il processo funziona senza l'utilizzo di un type personale. La cosa che più mi studisce è che in modalità debug funziona...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Mi sbaglio o le due strutture sono diverse?

  5. #5
    Non so proprio come ringraziarti , pensare che per una disattenzione così banale stavo per rinunciare. E' la seconda volta che mi fornisci una indicazione determinante alla soluzione dei miei problemi. I questo caso lo sviluppo parallelo delle due fasi non è stato contemporaneo e all'aggiornamento dell'applicazione non ho pensato che dovevo aggiornare anche la DLL.
    Per completezza aggiungo che in modalità debug funziona perchè il .t mancante non è utilizzato nella DLL ma solo nell'applicazione, e questo non ha generato errori... penso sia come quando all'atto della compilazione sono diagnosticati errori che in debug non sono riscontrati.
    Grazie ancora, spero almeno di essere stato utile a qualcuno nel riferimento all'articolo citato .
    Buona giornata, Michele

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Nostradamus123
    Non so proprio come ringraziarti
    Di nulla ...

    E' la seconda volta che mi fornisci una indicazione ...
    La terza ... ... se contiamo l'articolo ...

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.