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 :

Problème avec un appel DLL externe


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut Problème avec un appel DLL externe
    Bonjour,

    mon niveau de Delphi n'est pas exceptionnel et je sèche depuis plusieurs jours pour faire fonctionner une fonction, je n'ai jamais le résultat d'une variable précise qui est pourtant indispensable !

    La fonction de la DLL :

    type de retour : unsigned short
    nom fonction : Test_fonction
    type noms des paramètres :
    - unsigned char : leChemin
    - T_infosSpecial : lesinfosspecial
    - unsigned short : lenombredereponse
    - unsigned short : lecodederreur
    Je déclare ma fonction comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function nom fonction(
      leChemin: PAnsiChar;
      lesinfosspecial: TList;
      var lenombredereponse: integer;
      var lecodederreur: Word
      ): Word; stdcall; external 'madll.dll' name 'nom fonction';
    Je crée les var comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
        code_retour: integer;
        leChemin: AnsiString;
        lenombredereponse: integer;
        lesinfosspecial: tList;
        lecodederreur: word;
    puis je lance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    code_retour:=nom fonction(PAnsiChar(dossier_force),lesinfosspecial,lenombredereponse,lecodederreur);
    La valeur "lesinfosspecial" ne me sort jamais ce que je veux ou je n'arrive pas à y accéder; si quelqu'un à une idée (je suppose que je suis dans le faux en exigeant un Tlist...)

    Voici la documentation pour cette valeur :

    Si lesinfosspecial=NULL, la fonction retourne le nombre de réponses
    Si lesinfosspecial non NULL, pointeur sur un tableau de structures de type T_infosSpecial(voir ci-dessous), alloué par l’application utilisatrice


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct {
    	unsigned char  nom_ressource[256];
    	unsigned char  valeur1;	     
    	unsigned char  valeur2;	     
    	unsigned char  valeur3;		
    	unsigned short valeur4;	
    	unsigned short valeur5;
    	unsigned short valeur6;
    } T_infosSpecial;
    Merci à tous

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Il ne faudrait pas plutôt déclarer un type de cette façon?
    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
    type
    T_infosSpecial= packed record
        nom_ressource: array[0..255] of ansichar;
    valeur1 :UInt8;
    valeur2:UInt8;
    valeur3:UInt8;
    valeur4: UInt16;
    valeur5: UInt16;
    valeur6: UInt16;
    end;
    
    T_infosSpecials=array of T_infosSpecial;
    P_infosSpecial=^T_infosSpecial;
    
    function nom fonction( leChemin: PAnsiChar; lesinfosspecial: P_infosSpecial; var lenombredereponse: integer;var lecodederreur: Word): Word; stdcall; external 'madll.dll' name 'nom fonction';
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut
    Je pense effectivement qu'il faudrait que je parte par là mais j'ai du mal à voir où placer tout cela :

    où dois-je mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
    T_infosSpecial= packed record
        nom_ressource: array[0..255] of ansichar;
    valeur1 :UInt8;
    valeur2:UInt8;
    valeur3:UInt8;
    valeur4: UInt16;
    valeur5: UInt16;
    valeur6: UInt16;
    end;
    (d'ailleurs le end est logique sans begin ?)

    je suppose que la ligne "T_infosSpecials=array of T_infosSpecial;" va dans les déclarations "var"

    je suppose que la ligne "P_infosSpecial=^T_infosSpecial;" va dans ma déclaration de focntion

  4. #4
    Membre éclairé
    Avatar de nostroyo
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 680
    Points
    680
    Billets dans le blog
    16
    Par défaut
    Fais un premier appel avec nil comme paramètre pour lesinfosspecial, tu auras comme ça le nombre de réponse.

    En utilisant la structure de Linkin, tu alloues un espace mémoire de nombre de réponse * SizeOf(TInfosSpecial)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var
      LpInfosSpecial: PInfosSpecial;
      LNbReponse: Integer;
    begin
      // 1er appel pour récup LNbReponse
    GetMem(LpInfosSpecial, LNbReponse * SizeOf(TInfosSpecial));
      try
          // 2eme Appel avec LpInfosSpecial  pour lesinfosspecial
          // Parcours de ton espace mémoire pour récupérer chaque infos
      finally
        FreeMem(LpInfosSpecial, LNbReponse * SizeOf(TInfosSpecial));
      end;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par teubies Voir le message
    Fais un premier appel avec nil comme paramètre pour lesinfosspecial, tu auras comme ça le nombre de réponse.

    En utilisant la structure de Linkin, tu alloues un espace mémoire de nombre de réponse * SizeOf(TInfosSpecial)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var
      LpInfosSpecial: PInfosSpecial;
      LNbReponse: Integer;
    begin
      // 1er appel pour récup LNbReponse
    GetMem(LpInfosSpecial, LNbReponse * SizeOf(TInfosSpecial));
      try
          // 2eme Appel avec LpInfosSpecial  pour lesinfosspecial
          // Parcours de ton espace mémoire pour récupérer chaque infos
      finally
        FreeMem(LpInfosSpecial, LNbReponse * SizeOf(TInfosSpecial));
      end;
    J'arrive à peu près à comprendre le concept pour cette partie mais je ne vois pas où mettre les informations de Linkin, si je les place dans les var, ma déclaration de fonction plante

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function nom fonction(
      leChemin: PAnsiChar;
      lesinfosspecial: PinfosSpecial; // [EDIT] correction
      var lenombredereponse: integer; // pourquoi pas un Word (unsigned short : lenombredereponse) ???
      var lecodederreur: Word
      ): Word; stdcall; external 'madll.dll' name 'nom fonction';
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre éclairé
    Avatar de nostroyo
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 168
    Points : 680
    Points
    680
    Billets dans le blog
    16
    Par défaut
    En fait tu dois créer dans la partie déclaration, un type TInfosSpecial puis tu déclare un PInfosSpecial = ^TinfosSpecial; (un pointeur sur la structure). Il nous servira à pointer sur le premier élément.

    Exemple du 2 eme appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      lesinfosspecial: PInfosSpecial;
      ...
    begin
      // GetMem etc comme vu précédement
      code_retour:=nom fonction(PAnsiChar(dossier_force),lesinfosspecial,lenombredereponse,lecodederreur);
      lesinfosspecial^.valeur1   // accès au premier élément 
    // Après tu avances au suivant en incrémentant ton pointeur de la taille d'un TInfosSpecial

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    On doit même pouvoir parcourir le tableau avec un Inc(lesinfosspecial) qui avance le pointeur sur l'élément suivant.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut
    Magnifique !

    En recoupant toutes les infos, j'ai réussi à faire fonctionner la liaison DLL sans soucis et j'ai découvert, pas mal de nouvelles choses dans Delphi !


    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CGI-BIN] Problèmes avec les appels systèmes
    Par ozyamdias dans le forum Apache
    Réponses: 1
    Dernier message: 27/08/2007, 17h17
  2. problème avec un appel de fonction de callback de C++ vers C#
    Par surfurax dans le forum Framework .NET
    Réponses: 1
    Dernier message: 29/01/2007, 10h09
  3. [NASM] Problème avec l'appel des interruptions
    Par homeostasie dans le forum Assembleur
    Réponses: 3
    Dernier message: 23/01/2007, 16h50
  4. [vb.net]Problème avec des fichiers DLL
    Par nakata77 dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/09/2006, 18h40
  5. problème avec l'appel d'une fonction
    Par mademoizel dans le forum ASP
    Réponses: 5
    Dernier message: 26/06/2006, 15h04

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