Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Creare una DLL

  1. #1

    Creare una DLL

    Ciao a tutti.

    Avrei una domanda molto basilare.
    Come posso creare una dll con Visual Studio 2010 ?
    Questa dll dovrebbe contenere una simplice funzione FPUBPricePC che in argomento prende una String e restituisce un Single.

    Alla verità ho già fatto un test creando una "Class Library", ecco il codice:

    Public Class Class1
    Public Function FPubPricePC(ByVal stPC As String) As Single
    Dim sPricePC As Single
    If Left(stPC, 1) = "H" Then
    sPricePC = 2000
    Else
    sPricePC = 0
    End If
    FPubPricePC = sPricePC
    End Function
    End Class

    Dopo il build provo per esempio di utilizzare la dll in Excel/VBA aggiugendola ai riferimenti ma la dll risulta non valida.

    Qualcuno ha un suggerimento ?
    C'è un tutorial in giro ?

    Grazie.

  2. #2
    Ciao, benvenuto nel forum!
    Come prima cosa ti invito, se non l'hai già fatto, a leggere il regolamento della sezione e il regolamento generale.

    Riguardo alla tua richiesta: credo che il problema sia che VBA in Excel necessiti di una dll dotata di interfaccia COM, mentre quella che hai fatto tu non ce l'ha. Vai nelle proprietà del progetto, in "Application/Assembly information" prova a mettere il flag su "Make assembly COM-Visible" e a ricompilare.
    Chi non cerca trova.

  3. #3
    Chi non cerca trova.

  4. #4
    Grazie, il link mi è stato molto utile.

    Ciao.

  5. #5
    Ciao.

    Ho studiato questo esempio:
    http://support.microsoft.com/Default.aspx?kbid=817248
    La DLL funziona se la chiamo in un applicazione VB Visual studio 10, ma se provo di aggiungere la dll come riferimento nel VBA di Excel 2007 risulta che è "Impossibile aggiungere un riferimento al file specificato".

    Qualcuno a un suggerimento ?

    Ecco il codice della DLL:
    <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
    Public Class ComClass1

    #Region "COM GUIDs"
    Public Const ClassId As String = "6DB79AF2-F661-44AC-8458-62B06BFDD9E4"
    Public Const InterfaceId As String = "EDED909C-9271-4670-BA32-109AE917B1D7"
    Public Const EventsId As String = "17C731B8-CE61-4B5F-B114-10F3E46153AC"
    #End Region

    Public Sub New()
    MyBase.New()
    End Sub

    Public Function myFunction(ByVal stText As String) As Integer
    Dim iVal As Integer
    If Left(stText, 1) = "H" Then
    iVal = 100
    Else
    iVal = 0
    End If
    myFunction = iVal
    End Function
    End Class

  6. #6
    Ho provato anch'io e ho ottenuto lo stesso problema. Poi, tanto per provare, nei riferimenti di VBA ho selezionato il file .TLB (anziché il .DLL) e magicamente funziona tutto
    Chi non cerca trova.

  7. #7
    Grazie.

    Bella la mossa del file TLB . Effettivamente la libreria si carica in VBA, però quando si definisce l'oggetto chiamando il TLB si ferma il programma...

    Public Function FH(stTxt As String) As Integer
    Dim myObject As Prova1.ComClass1

    myObject = New Prova1.ComClass1 '(si ferma qua)
    FH = myObject.myFunction(stTxt)
    End Function

    Non ho passato in argomento questi parametri del esempio Microsoft (ByVal sender As System.Object, ByVal e As System.EventArgs) perché non mi sembravano utili e che comunque VBA mi dice che non sono stati definiti dall'utente.

    Hai un idea ?

  8. #8
    Per favore, ricordati di usare i tag CODE /CODE (tra parentesi quadrate) quando posti del codice, altrimenti diventa tutto illeggibile.
    Io ho provato questo codice e funziona:
    codice:
    <ComClass(alfa.ClassId, alfa.InterfaceId, alfa.EventsId)> _
    Public Class alfa
    
    #Region "COM GUIDs"
        ' These  GUIDs provide the COM identity for this class 
        ' and its COM interfaces. If you change them, existing 
        ' clients will no longer be able to access the class.
        Public Const ClassId As String = "c069be39-c81c-410e-8828-c348ab245956"
        Public Const InterfaceId As String = "a5e4ba01-217d-411d-b751-33b0a4b21a04"
        Public Const EventsId As String = "304e6fc0-5112-4690-8957-648a0f4b9cf8"
    #End Region
    
        ' A creatable COM class must have a Public Sub New() 
        ' with no parameters, otherwise, the class will not be 
        ' registered in the COM registry and cannot be created 
        ' via CreateObject.
        Public Sub New()
            MyBase.New()
        End Sub
    
        Public Function Test() As String
            Return Now.ToString
        End Function
    End Class
    In Excel:
    codice:
    Public Sub Prova()
        Dim a As New alfa
        
        Debug.Print a.Test
    End Sub
    Chi non cerca trova.

  9. #9
    Tas sei un grande. Grazie di tutto.

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.