IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[VB]type d'arguments byref incompatibles


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut [VB]type d'arguments byref incompatibles
    Bonsoir a tous,
    J'ai crée une dllen c que je souhaite utiliser sous Vb. Voici la declaration de ma dll sous vb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Type variete
    nom As String * 21
    topt As Single
    tbase As Single
    tsum As Single
    cpp As Single
    bvp As Single
    toptm As Single
    cdrm As Single
    tcritc As Single
    tcrith As Single
    tcritd As Single
    End Type
     
     Public Declare Function dllecrire Lib "win.dll" Alias "parametre" (var1 As variete, var2 As variete) As Integer
    Pour l'appel voici ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    retour = dllecrire(var1, var2)
    Mais voici le message affiché: type d'arguments byref incompatibles

    Pouvez vous m'aider?

  2. #2
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    si c'est toi qui as créé la Dll, tu es bien LE SEUL à connaître la structure de variete, ma foi !
    comment veux-tu que l'on devine ?

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Points : 733
    Points
    733
    Par défaut
    Tu n'oublie pas de déclarer var1 et var2 dans le projet ou tu l'utilise comme des variete

    retour = dllecrire(var1, var2)
    N'oubliez pas de mettre le

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Voici la declaration de mastructure dans C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct variete
    {
    char nom[21];
    float topt, tbase, tsum, cpp, bvp, toptm, cdrm, tcritc, tcrith, 
    tcritd;
    } ST_VARIETE;
    Voici la fonction qui la fonction de ma dll


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    int __stdcall parametre (ST_VARIETE * Variet1,ST_VARIETE * Variet2) 
    {
    #define REPIQUAGE 'T'
    #define DIRECT 'D'
     
    char Implantation;
    char Pre_irrig;
    int Ressuyage, Trav_sol, Miseneau, Repiquage, Recolte;
    int Contrainte, Duree;
    int J_semis_d;
    char Fic_met[81];
     
    FILE *buf= NULL;
    int n;
    char lig[256], rep[256], *s, *t;
    /* si le fichier de sortie existe, l'effacer => l'existence du fichier 
    de sortie indique que la simulatio est allee jusqu'au bout */
    if (access( "C:/ELISEE/APPIA/Calcul/vbappia/calcul.$$O", 0)==0) unlink("calcul.$$O");
     
    buf = fopen( "C:/ELISEE/APPIA/Calcul/vbappia/calcul.$$I", "rt");
    if (!buf) exit( -1 );
     
    fgets( lig, 255, buf); /* entete */
    s=fgets( lig, 255, buf); if (!s) exit(-1); /* durees */
    while( *s && *s!='=') s++;
    n = sscanf( s+1, "%d %d %d %d %d %c", &Duree, &Trav_sol, 
    &Miseneau, &Repiquage, &Recolte, &Contrainte);
    if (n < 6) exit(-1);
    s=fgets( lig, 255, buf); if (!s) exit(-1); /* implantation */
    while( *s && *s!='=') s++;
    s++;
    while( *s && *s==' ') s++;
    t = s;
    if (*s=='\n') exit(-1);
    while( *t && *t!='\n') t++;
    *t = 0;
    if (stricmp( s, "SEMIS DIRECT")==0) Implantation = DIRECT;
    else Implantation = REPIQUAGE;
    s=fgets( lig, 255, buf); if (!s) exit(-1); /* pre-irrig */
    while( *s && *s!='=') s++;
    sscanf( s+1, "%s", rep);
    if (n < 1) exit(-1);
    if (strcmp( rep, "oui")==0) Pre_irrig = 1;
    else Pre_irrig = 0;
    s=fgets( lig, 255, buf); if (!s) exit(-1); /* Ressuyage */
    while( *s && *s!='=') s++;
    sscanf( s+1, "%d", &Ressuyage);
    if (n < 1) exit(-1);
    s=fgets( lig, 255, buf); if (!s) exit(-1); /* J_semis_d (nb de jours 
    depuis le 1/01, sans prise en compte d'annee bissextile) ; si 1/01 alors 
    J_semis_d = 0 */
    while( *s && *s!='=') s++;
    sscanf( s+1, "%d", &J_semis_d);
    if (n < 1) exit(-1);
    s=fgets( lig, 255, buf); if (!s) exit(-1); /* Nom variete 1 */
    while( *s && *s!='=') s++;
    s++;
    while( *s && *s==' ') s++;
    t = s;
    if (*s=='\n') exit(-1);
    while( *t && *t!='\n') t++;
    *t = 0;
    strcpy( Variet1->nom, s);
    s=fgets( lig, 255, buf); if (!s) exit(-1); /* Nom variete 2 */
    while( *s && *s!='=') s++;
    s++;
    while( *s && *s==' ') s++;
    if (*s=='\n') strcpy( Variet2->nom, Variet1->nom);
    else
    {
    t = s;
    while( *t && *t!='\n') t++;
    *t = 0;
    strcpy( Variet2->nom, s);
    }
    s=fgets( lig, 255, buf); if (!s) exit(-1); /* Nom fichier meteo */
    while( *s && *s!='=') s++;
    s++;
    while( *s && *s==' ') s++;
    t = s;
    if (*s=='\n') exit(-1);
    while( *t && *t!='\n') t++;
    *t = 0;
    strcpy( Fic_met, s);
    fclose( buf );
    return (Ressuyage) ;
    }

  5. #5
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    tente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Declare Function dllecrire Lib "win.dll" Alias "parametre" _
              (ByVal var1 As variete, ByVal var2 As variete) As Integer
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    J'ai essayé le code mais voici l'érreur affiché:
    Un type passé par l'utilisateur ne peut être passé par valeur (byval)

  7. #7
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    J'ai l'impression que le problème vient des types dans ta structure :
    Tes Single ici et là (correspondant à des floats de C) devraient peut-etre être des Double (essaye aussi des Variant, dans ta structure).
    Une autre fois, tu es bien le seul à savoir ce qu'attend ta dll (et ce que tu lui envoies et ce qu'elle doit retourner)

    A quel moment exactement reçois-tu le message d'erreur ?
    Si c'est à l'exécution : peux-tu nous expliquer le type des paramètres/arguments qui lui sont passés depuis VB (var1 et var2)?
    Personnellement, var1 et var2 étant dans une fonction déclarée publique, j'éviterais d'utiliser leur nom dans l'appel de la fonction !

    Je suis également assez surpris (mais cela n'a rien à voir) par la création d'une dll comprenant un chemin en dur

Discussions similaires

  1. [XL-2007] type d'arguments ByRef incompatible
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 14/04/2019, 19h31
  2. [XL-2010] Erreur de compilation; Type d'argument ByRef incompatible
    Par Toug19 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/05/2015, 16h01
  3. Type d'argument ByRef incompatible
    Par caroto dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 22/09/2013, 13h45
  4. Type d'argument Byref incompatible
    Par Glherbier dans le forum VBA Access
    Réponses: 13
    Dernier message: 02/11/2010, 10h30
  5. [AC-2007] Type d'argument ByRef incompatible dans un module
    Par KIK83 dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/12/2009, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo