none
Conversion vb6 vers c# RRS feed

  • Question

  • Bonjour,

    Je vous explique mon problème je dois convertir une fonction sous vb6 en c# mais je vous avoue que je bloque un peux.

    La fonction vb est celle ci:

     Public Function ReadSMBusBlock(ByVal ySubCommand As Byte, sResponse As String) As Long
        Dim lerror As Long
        Dim Data(128) As Byte
        Dim nLen As Integer
        Dim SubCmd As Integer
        SubCmd = ySubCommand
        'To call ReadSMBusBlock() we need a pointer to variant containing array of bytes
        'So assign an array of bytes to variant v and use v as argument to the call
        Dim v As Variant
        v = Data
        sResponse = ""
        lerror = Form1.Bq80xRW1.ReadSMBusBlock(SubCmd, v, nLen, &H17)
        If lerror = 0 Then  'Stick return data into a string
            Dim X As Integer
            For X = 0 To nLen - 1
                'sResponse = sResponse & Chr(v(X)) This will display actual string for mfg name
                Dim tmpStr As String
                tmpStr = Hex$(v(X))
                If Len(tmpStr) < 2 Then
                    tmpStr = "0" & tmpStr
                End If
                sResponse = sResponse & tmpStr
            Next X
        End If

    '    ReportCommErrors lError
        ReadSMBusBlock = lerror
    End Function

    et la fonction que j'ai développé en c# est celle ci:

                            

    public int ReadSMBusBlock(byte ySubCommand,  string sResponse )
    {
        int result;
        byte[] Data= new byte[128];
        int nLen ;
        short nlen=0;
        int SubCmd ;
        SubCmd = ySubCommand;
        object v =Data ;
        //v = (object)Data;

        result = axBq80xRW1.ReadSMBusBlock(((short)SubCmd), ref v, ref nlen, 0x17);
        nLen = (int)nlen;
        if (result == 0) {  
            int X ;

            for (X = 0 ;X<= nLen - 1;X++)
            {

                string tmpStr ;
                tmpStr = v.ToString();//hexa
                if (tmpStr.Length < 2) 
                {
                    tmpStr = "0" + tmpStr;//&
                }
                sResponse = sResponse + tmpStr;//&
            }
        }
        return result;
    }

    la ligne qui pose problème est la ligne qui fait appelle à un driver ocx   :

        axBq80xRW1.ReadSMBusBlock(((short)SubCmd), ref v, ref nlen, 0x17);

    elle ne veux pas s’exécuter mais compile comme il faut.

    Si quelqu'un a des idées pour améliorer ma conversion je suis preneur.

    En Vous remerciant.

    Cordialement

    jeudi 2 juillet 2015 11:22

Réponses

Toutes les réponses

  • Bonjour,

    Pouvez-vous préciser le "elle ne veut pas s'exécuter" ? Vous avez un message d'erreur? autre chose ?

    Sinon pour information le "Integer" de VB6 correspond au "short" du C# (Int16 du .Net).

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    jeudi 2 juillet 2015 12:48
  • Merci de votre réponse voici le code erreur:

    Une exception non gérée du type 'System.Runtime.InteropServices.COMException' s'est produite dans mscorlib.dll

    Informations supplémentaires : Le type ne correspond pas. (Exception de HRESULT : 0x80020005 (DISP_E_TYPEMISMATCH))

    Cordialement 

    Julien DREAN

    jeudi 2 juillet 2015 14:30
  • Je me doutais un peu de la blague. C'est pour cela que j'ai prévenu concernant le type "Integer" sous C#.

    Il faut vérifier la signature de votre méthode "ReadSMBusBlock", notamment en ce qui concerne les arguments par référence "ref v" et "ref nlen", mais je pense plus pour votre variable "v" que mettez en objet.

    Pouvez-vous communiquez la signature de votre méthode, car je suis surpris qu'il faille transmettre un "object", alors que votre donnée est un tableau de byte et que c'est un type supporté par COM.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    jeudi 2 juillet 2015 14:41
  • Je suis une quiche :)

    Il faut encapsuler vos données en variant avec VariantWrapper(), voir cet article : https://social.msdn.microsoft.com/Forums/vstudio/en-US/35e58472-2eec-432f-93da-35b1de2281c6/calling-com-method-with-inout-array-param-with-c?forum=clr

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse DREAN Julien jeudi 2 juillet 2015 15:40
    jeudi 2 juillet 2015 14:45
  • public virtual short ReadSMBusBlock(short nSmbCmd, ref object dataBlock, ref short nLen, short nTargetID)
        Membre de AxBQ80XRWLib.AxBq80xRW

    Ce sont les seules infos que j'ai sur la fonction que j'utilise comme elle vient d'un fichier .ocx.

    Cordialement,

    Julien drean

    jeudi 2 juillet 2015 15:17
  • Un grand merci à vous Yan mon problème est résolu grâce à votre commentaire avec la fonction VariantWrapper().

    Juste pour information pour ceux qui aurais le même problème sur le forum qui est en lien n'oubliez pas le "s" à services car il n'est pas présent sur cette ligne :

    object theObject = new System.Runtime.InteropService.VariantWrapper(theArray);


    Encore merci à vous Yan.

    Cordialement,

    Julien DREAN

    jeudi 2 juillet 2015 15:51
  • Bonjour,

    En complément, je vous propose d'utiliser un converteur VB.NET vers C# ou vice versa. Personnellement, j'utilise celui de Telerik . VB6 est différent de VB.NET mais de point de vue pratique il y a pas mal de ressemblances syntaxiques qui puissent vous faire gagner du temps.

    Cordialement,

    Maher Jendoubi

    dimanche 5 juillet 2015 15:44