Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




[VB6] Convertire un array da Variant ad Object


Messaggi consigliati

Inserito:

Buongiorno a tutti, 
sto aggiornando un vecchia applicazione sviluppata in VB6 nella quale sto integrando delle chiamate ad una dll sviluppata in .net.

Ho un array di tipi Variant

Dim myArray() As Variant



ho necessità di convertire il tipo da Variant ad Object (la funzione che devo chiamare dalla DLL integrata accetta in ingresso solo un array di object).

Come procedere?

Grazie.

Inserita:

Sono un po' arrugginito con VB6, comunque prova a dare un'occhiata qui

Inserita:

Allora,

 

ho fatto un po' di prove prima di sconfiggere l'incompatibilità dei dati tra VB6 e CSharp, alla fine ho capito che passando l'Array di Variant con la funzione Array(varr()) C# li accetta senza lamentarsi, inoltre ho anche letto parecchie richieste di questo tipo senza che nessuno abbia suggerito qualcosa di utile a riguardo, quindi fanne tesoro...

 

Comunque non hai detto se hai già l'interfaccia COM per comunicare tra VB6 e C#, non sperare di chiamare le DLL come se fossero delle comuni API, al limite puoi usare quelle che compaiono nelle Referenze del Progetto in VB6, fai sapere qualcosa di più specifico...

 

Inserita: (modificato)

Devo Specificare che VB6 crea oggetti del tipo System.__ComObject, mentre in C# sono del tipo System.Object, quindi anche passandogli l'Array di oggetti (a patto di riuscire a convertirli), l'Errore è assicurato...

 

Questo è il codice che ho usato in C#;

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;

namespace ClassLibraryName
{

    public class ClassName
    {

        public object[] TestVariantToObject(object[] param)
        {
           
           int i = 0;
           object[] o = new object[param.Length];

           for (i = 0; i < param.Length; i++)
           {
               o[i] = param[i];
           }
           
           return o.ToArray();

        }

    }

}

 

Questo è il codice che ho usato in VB6;

 

Option Explicit

Dim WithEvents CSharpInteropServiceEvents As CSharpInteropService.LibraryInvoke

Private Sub CSharpInteropServiceEvents_MessageEvent(ByVal message As String)
    Debug.Print message
End Sub

Private Sub mnu_TestVariantToObject_Click()
Dim ret As Variant
Dim v(10) As Variant
Dim i As Integer

    v(0) = CDbl(1.25846582454)
    v(1) = "Pippo"
    
    Set v(2) = Icon
    
    v(3) = CSng(3.14)
    v(4) = CDate(Now)
    v(5) = CLng(546827957)
    v(6) = CCur(1000000000)
    v(7) = CInt(999)
    v(8) = CByte(1)
    
    Set v(9) = Form1
    Set v(10) = Form1.Font
    
    Dim load As New LibraryInvoke
    
    Set CSharpInteropServiceEvents = load ' For Debug Events
    
    ' Call .NET C# Function by GenericInvoke Intrerface: '
    ' GenericInvoke(LIB_PATH_TO_LOAD, CLASS_LIBRARY.CLASS_NAME, FUNCTION_NAME, PARAM()) '
    ret = load.GenericInvoke(App.Path + "\..\ClassLibrary\bin\Debug\ClassLibrary.dll", "ClassLibraryName.ClassName", "TestVariantToObject", Array(v()))

    For i = LBound(ret) To UBound(ret)
        If Not IsObject(ret(i)) Then
            Debug.Print ret(i)
        Else
            Debug.Print TypeName(ret(i))
        End If
    Next i
   

End Sub

 

Questo è il risultato di ritorno dalla funzione C# come Array() di Variant;

 

1,25846582454               Double
Pippo                       String
Type: 3                     Picture
3,14                        Single
10/12/2019 14:30:32         Date
546827957                   Long
1000000000                  Decimal
999                         Integer
1                           Byte
Type: 9                     MDIForm1
Type: 8                     Font

 

 

Modificato: da GiRock

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...