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

    [VB.NET] Passaggio puntatore di una funzione ad una dll

    Salve a tutti,
    Sto tentando di fare un programma che mi gestisca una periferica utilizzando le librerie e il materiale che la casa mi ha messo a disposizione. Tra le cose che ho trovato in rete c'è il sorgente di un piccolo applicativo scritto in Visual Basic 6.0 e iniziando da quello ho pensato di costruire il mio in VB.NET. Il mio problema è che ad un certo punto devo dichiarare una funzione di una libreria che a sua volta dovrà chiamare una mia funzione che (da quel che ho capito) si chiama "delagata". Lascio spazio al codice che è più chiaro:
    codice:
    Private Declare Function GUICallbacks Lib "PvFw.dll" ( _
        ByVal ModuleHandle As Long, ByVal GuiStreamingCasllback As Long, _
        ByVal GuiStreamingCallbackCtx As Long, ByVal GuiStateCallback As Long, _
        ByRef GuiStateCallbackCtx As Long) As Long
    Per utilizzare questa funzione mi portano in codice Visual Basic 6.0:
    codice:
    'Usage
        Dim ret As Long
        ret = GUICallbacks(myHandle, 0&, 0&, AddressOf GUI_STATE_CALLBACK, 0&)
    End Sub
    'dove mi dicono che
    Public Sub GUI_STATE_CALLBACK (ByVal GuiStateCallbackCtx As Long, _
                              ByVal GuiState As Long, ByVal Response As Byte, _
                              ByVal Message As Long, ByVal Progress As Byte, _
                              ByVal SampleBuffer As Long)
        Dim msg As String
        Select Case Message
            Case &H2030200
                Msg = ... 
        End Select
        'Display Guidance message
        Form1.Label1.Caption = GuidanceMsg   'Exemle
    End Sub
    Se io tento di riportare nel mio progetto un codice simile quando chiamo la funzione GUICallbacks(myHandle, 0&, 0&, AddressOf GUI_STATE_CALLBACK, 0&) mi segnala che "l'espressione 'AddressOf' non può essere convertita in 'Long' perché 'Long' non è un tipo delegato.
    Ho provato a vedere se creando un tipo "delegate" riuscivo a farlo diventare un Long (che dovrebbe essere un puntatore alla cella di memoria che contiene la funzione) ma il fatto che stia scrivendo qui è la prova che non ci sono riuscito.

    Questa volta sono proprioo disperato. Utilizzo Visual Basic 2008 Professioal edition.

  2. #2
    1. Nel convertire i progetti da VB6 a VB.NET occhio ai tipi numerici, che non corrispondono; usa questa tabella di conversione:
    codice:
    Byte (Bit)   VB6          VB.NET
    1 (8)        Byte         Byte (System.Byte)
    2 (16)       Integer      Short (System.Int16)
    4 (32)       Long         Integer (System.Int32)
    8 (64)       n.d.         Long (System.Int64)
    2. Fai così:
    codice:
    Public Delegate GUI_STATE_CALLBACK (ByVal GuiStateCallbackCtx As Integer, _
                              ByVal GuiState As Integer, ByVal Response As Byte, _
                              ByVal Message As Integer, ByVal Progress As Byte, _
                              ByVal SampleBuffer As Integer)
    
    Public Declare Function GUICallbacks Lib "PvFw.dll" ( _
        ByVal ModuleHandle As System.IntPtr, ByVal GuiStreamingCallback As System.IntPtr _
        ByVal GuiStreamingCallbackCtx As Integer, ByVal GuiStateCallback As GUI_STATE_CALLBACK _
        ByRef GuiStateCallbackCtx As Integer) As Integer
    
    '...
    
        Dim ret As Integer
        ret = GUICallbacks(myHandle, 0, IntPtr.Zero, AddressOf TuaProcedura, 0)
    
    '...
    
    Public Function TuaProcedura (ByVal GuiStateCallbackCtx As Integer, _
                              ByVal GuiState As Integer, ByVal Response As Byte, _
                              ByVal Message As Integer, ByVal Progress As Byte, _
                              ByVal SampleBuffer As Integer)
        '...
    End Function
    Probabilmente anche GuiStreamingCallback è un puntatore a funzione; se intendi utilizzarlo devi creare un delegate anche per lui.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Innanzitutto grazie 1000, soprattutto per l'informazione "gratuita" sulle variabili, senza di quella sarebbe stato un'altro grattacapo da risolvere in fase d debug.
    Ho scritto il codice come mi hai consigliato ed effettivamente non mi genera più errori, ora devo finire il codice prima di testarlo. Comunque se mi ritrovo con un altro problema del genere vedrò di procedere allo stasso modo.

    Ora però mi piacerebbe sapere anche un po' di "teoria", cioè la funzione della dll mi richede come parametro un long che dovrebbe essere il puntatore della cella di memoria in cui inizia la funziona callback. Con questo sistema io non passo un long, ma una variabile Delagate ... è euivalente al puntatore richiesto? cioè... passa il valore numerico della cella di memoria?

  4. #4
    Originariamente inviato da Vendaval
    Innanzitutto grazie 1000, soprattutto per l'informazione "gratuita" sulle variabili, senza di quella sarebbe stato un'altro grattacapo da risolvere in fase d debug.
    Di niente.
    Ora però mi piacerebbe sapere anche un po' di "teoria", cioè la funzione della dll mi richede come parametro un long che dovrebbe essere il puntatore della cella di memoria in cui inizia la funziona callback. Con questo sistema io non passo un long, ma una variabile Delagate ... è euivalente al puntatore richiesto? cioè... passa il valore numerico della cella di memoria?
    All'atto pratico sì, VB.NET passa un puntatore alla funzione.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.