Vai al contenuto
PLC Forum


[VB6] Convertire un array da Variant ad Object


robertosalemi

Messaggi consigliati

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.
Link al commento
Condividi su altri siti


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...

 

Link al commento
Condividi su altri siti

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
Link al commento
Condividi su altri siti

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...