Jump to content
PLC Forum

robertosalemi

[VB6] Convertire un array da Variant ad Object

Recommended Posts

robertosalemi

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 to post
Share on other sites

GiRock

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 to post
Share on other sites
GiRock

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

 

 

Edited by GiRock
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...