Passage d'un char* d'une dll en C vers Vb.net 2008

cs_megamario Messages postés 145 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 14 février 2013 - 16 déc. 2009 à 09:39
cs_megamario Messages postés 145 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 14 février 2013 - 20 déc. 2009 à 09:40
Bonjour

j'arrive pas a récupéré un paramètre "char * "de ma Dll écrite en C. cela me provoque une erreur pinvoque.

Déclaration dans ma Dll en C:

//... d'autre fonction dispo
extern __declspec(dllexport) __stdcall void GetMessages(char* message)
{
     delta();
     if (Calc == -1)
        strcpy(message,"Calculs impossibles : delta négatif");
     else
        strcpy(message,"Calculs possibles : delta positif");
}


En VB:
Declare Sub DLLInit Lib "Dll.dll" Alias "init" _
        (ByVal a As Single, ByVal b As Single, ByVal c As Single)
    Declare Function DLLDelta Lib "Dll.dll" Alias "delta" _
    () As Single
    Declare Function DLLRacine1 Lib "Dll.dll" Alias "racine1" _
    () As Single
    Declare Function DLLRacine2 Lib "Dll.dll" Alias "racine2" _
    () As Single    
Declare Sub Messages Lib "Dll.dll" Alias "GetMessages" _
    (ByRef Mess() As Char)

    Sub Main()
        Dim delt As Single
        Dim Mess() As Char
        DLLInit(5, 4, 5) ' fonctionne
        delt = DLLDelta()
        Messages(Mess)   'plante ici
        If delt <> -1 Then
            'Console.Write(Mess.ToString)
            Console.Write(delt)
            Console.Write(DLLRacine1())
            Console.Write(DLLRacine2())
        Else
            Console.Write(Mess)

        End If
        Console.ReadLine()
    End Sub





Technicien en électricité Industriel (39 ans), en cours de reconversion BTS IRIS 2eme Année.
Au lycée pendant l'année scolaire, et en stage pendant les vacances scolaire.

6 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 déc. 2009 à 10:29
utilises un String plutot qu'un Char()


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_megamario Messages postés 145 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 14 février 2013
16 déc. 2009 à 10:51
A quel niveau.
Si c'est dans la Dll, c'est imposé et je ne doit pas y toucher

Technicien en électricité Industriel (39 ans), en cours de reconversion BTS IRIS 2eme Année.
Au lycée pendant l'année scolaire, et en stage pendant les vacances scolaire.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 déc. 2009 à 10:53
dans l'appel a ta dll (en VB)


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_megamario Messages postés 145 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 14 février 2013
19 déc. 2009 à 21:44
Bonsoir,
Aprés plusieurs tentative infructueuse, l'un de mes prof nous a donné la (ou une) solution. La reception se fait en Byte.

Aillant pas vraiment trouvé l'info sur le net je vous donner la solution que je vais poster par la suite en tuto.

voici un exemple de code pour la Dll en C, vraiment ultra simplifiée pour comprendre le fonctionnement.

//---------------------------------------------------------------------------

#include <windows.h>
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}

//Exemple de passage d'un char*
extern __declspec(dllexport) __stdcall void MonMessage (char* message)
{
        char MonMess[20] = "Bonjours";
        strcpy( message,MonMess);

}

//Exemple pour retourner un entier
extern __declspec(dllexport) __stdcall int MonEntier (void)
{
        return 8;
}
//Exemple pour passer en paramettre un entier
extern __declspec(dllexport) __stdcall void MonEntier2 (int* LeNum)
{
        *LeNum = 12;
}



Voici le code en VB.Net

Imports System.Console
'
Module Module1
    'Declaration des Fonction de la Dll
    Declare Auto Function MonNumero Lib "MaDll.dll" Alias "MonEntier" () As Integer
    Declare Auto Sub MonNumero2 Lib "MaDll.dll" Alias "MonEntier2" (ByRef Num As Integer)
    Declare Auto Sub Montexte Lib "MaDll.dll" Alias "MonMessage" (ByVal Mess() As Byte)
    '
    Sub Main()
        Dim MonNum As Integer
        Dim MonNum2 As Integer
        Dim Text As String
        Dim Buffer(50) As Byte
        '
        MonNum = MonNumero()
        MonNumero2(MonNum2)
        '
        Montexte(Buffer)
        'Converion des Byte en String
        Text = System.Text.ASCIIEncoding.UTF7.GetString(Buffer)
        '
        'Ecriture dans la console
        Write("Le Numero est : " & MonNum & vbCrLf)
        Write("Le Numer2 est : " & MonNum2 & vbCrLf)
        Write("Le Texte est : " & Text & vbCrLf)
        '
        'Attente d'une touche
        ReadLine()
    End Sub
End Module


Technicien en électricité Industriel (39 ans), en cours de reconversion BTS IRIS 2eme Année.
Au lycée pendant l'année scolaire, et en stage pendant les vacances scolaire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 déc. 2009 à 08:21
je connais peu .Net

néanmoins, en VB6 on ne passe pas par du Byte()

je doute pas que cela fonctionne, mais je pense qu'un String aurai pu faire l'affaire....

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_megamario Messages postés 145 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 14 février 2013
20 déc. 2009 à 09:40
J'ai essaye dans tout les sens pour le faire en string mais je n'y suis pas arrivé.
Je parle bien sur sans toucher au char* de la DLL.


Technicien en électricité Industriel (39 ans), en cours de reconversion BTS IRIS 2eme Année.
Au lycée pendant l'année scolaire, et en stage pendant les vacances scolaire.
0
Rejoignez-nous