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

Langage Delphi Discussion :

Dll et passage de structure


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    746
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 746
    Points : 500
    Points
    500
    Par défaut Dll et passage de structure
    bonjour a tous..

    J'ai une DLL, avec la fonction suivante (qui actuellement fonctionne tel quelle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function MesIsol(Rseuil,Tm,Ta,Td,Idisj,tension:real;Affpopup:boolean; var ResultMes : real):integer ;stdcall;
    Mais je dois la modifier pour retourner un autre type de résultat, la paramètre en gras dans la fonction ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Function MesIsol(Rseuil,Tm,Ta,Td,Idisj,tension:real;Affpopup:boolean; var ResultMes : real; var ResultEquip:Une_Structure):integer ;stdcall;
    voici donc mon problème, comment définir ma structure qui doit être de la forme suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    type TUne_Structure  = record
       Pas :integer;
       GA  :integer;
       Def :Pchar; // 20 caracteres max 
       SE  : real;
    end;
    var Une_Structure :array of TUne_Structure;
    1° Il faut que cette structure reste simple, car elle doit être interprétée par le programme appelant la DLL qui est en C ou C++ (labview).

    2° Cette structure peut elle être dynamique ou doit on la rendre fixe ?

    3° si cela est impossible, avez vous d'autre idées ?

    si je peux avoir un exemple de déclaration dans la Dll et dans le programme appelant ça super bien !!

    merci d'avance !
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    alors tu vas dialoguer avec du C/C++ donc tu oublies tout ce qui est dynamique car ça implique le gestionnaire mémoire qui n'est pas partagé avec C/C++

    ...enfin tu peux allouer un "array of" sous Delphi, mais C/C++ ne pourra que modifier son contenu, pas sa longueur.

    pour ce genre de chose, on envoie généralement un pointeur vers le premier élément du tableau (^TUne_Structure) et un entier qui indique le nombre d'éléments du tableau.

    ceci dit tu as une entrée Def:PChar qui pose problème...est-elle allouée par Delphi ou c'est C/C++ qui doit l'alimenter ?

    ne peux-tu pas simplement définir un string[20] ? ça t'évitera de savoir qui doit allouer/libérer le PChar

    sachant qu'on niveau C/C++ ça sera

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct string {
      char len;
      char str[20];
    }
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    746
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 746
    Points : 500
    Points
    500
    Par défaut
    salut Paul THOT,

    Quelques infos de plus..

    En Delphi => la DLL
    En C/C++ => l'applicatif utilisant la DLL

    L'application ne doit être capable que de lire le tableau envoyé par la DLL, il ne le "dimensionne pas et n'écrit aucun enregistrement". donc c'est bien sous Dephi que la taille est déterminé et que les enregistrements sont renseignés.

    Quand je parle de "dynamique", je parle de taille variable du tableau que la DLL envoi à l'application, on parle de ma même chose? , puisque plus bas tu parle de "array of" qui pour moi est dynamique.

    en ce qui concerne le Pchar .. je sais que pour retourner du texte en paramètre dans une DLL il faut des Pchar et pas de string. Mais cela est peut être différent quand on passe par une structure.

    donc :
    si je fais ceci par exemple dans la 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
     
    type TUne_Structure  = record
       Pas :integer;
       GA  :integer;
       Def :string[20]; 
       SE  : real;
    end;
    var Une_Structure :array of TUne_Structure;
    ...
    ...
    Function MesIsol(Rseuil,Tm,Ta,Td,Idisj,tension:real;Affpopup:boolean; var ResultMes : real; var ResultEquip:Une_Structure):integer ;stdcall;
    begin
           setlength(ResultEquip, n)
           ResultEquip[0].pas:=xxx;
           ...
           ResultEquip[n+1].pas:=xxx;
           ....
    end;
    et de l'autre coté la personne qui va coder la "réception" du résultat devra déclarer quelle structure pour pouvoir lire la mienne ?
    mon exemple est certainement faut ? a completer !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct string {    
       int, Pas ;
       int, GA  ;
       char def;
       char str[20];
       Float, SE ;
    }
    cela permettra d'envoyer du coté DLL et recevoir du coté application les valeur du tableau ? je semble exigeant mais n'ayant pas la partie applicative pour faire les essais, je cherche le plus de conseil.


    merci
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    ok, tant que c'est de la lecture seule, tu fais ce que tu veux...il faut juste que la structure soit correctement déclarée en C

    par conséquent, tu PEUX utiliser des STRING tant que le C les considère comme des PChar...car un STRING Delphi est un pointeur vers une chaine de caractère terminée par un #0 (avec des infos en plus à des offsets < 0 mais ça le C n'a pas besoin de le savoir pour LIRE le PChar)

    de même tu PEUX utiliser un tableau dynamique, car le programme C se fiche de savoir comment tu as alloué ta structure, il veux simplement que les enregistrements se suivent en mémoire

    ATTENTION utilise Single ou Double mais pas Real !

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type TUne_Structure  = record
       Pas : integer;
       GA  : integer;
       Def : string; 
       SE  : Double; // ou Single !!!
    end;
    var Une_Structure :array of TUne_Structure;
    begin
      SetLength(Une_Structure, 10);
      Une_Structure[0].pas := ...
      appel_fonction(..., @Une_Structure[0], length(Une_Structure)); // adresse du premier élément
    end;
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct TUne_Structure {
      int Pas;
      int GA;
      char * Def;
      double SE; // ou float !!!
    }
    void appel_fonction(..., struct TUne_Structure * tab, int count) {
      for (int i = 0; i < count; i++) {
        if (tab[i].pas == ...)
      }
    }
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. passage de structure par pointeur a une API de DLL
    Par Kanter dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/07/2010, 20h51
  2. Passage de structure dans une DLL
    Par nikoko34 dans le forum VB.NET
    Réponses: 1
    Dernier message: 18/07/2008, 10h11
  3. Passage de structure en paramètre
    Par pegase.90 dans le forum C
    Réponses: 16
    Dernier message: 16/04/2007, 15h56
  4. Passage de structure en parametres
    Par beb30 dans le forum Visual C++
    Réponses: 10
    Dernier message: 28/08/2006, 17h31
  5. [Activex] Passage de Structure
    Par KPitN dans le forum MFC
    Réponses: 2
    Dernier message: 07/03/2005, 14h05

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