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 :

Procedure et fonction avec nombre et type de param indéfini [FAQ]


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut Procedure et fonction avec nombre et type de param indéfini
    Bonjour à tous,

    Voilà je tente de faire une application avec un système de plugin et pour pouvoir y connecter facilement n'importe quel style de dll je pensais utiliser la syntaxe suivante à l'interieur des dlls:

    Function mafonction(params : Array of Const) : variant

    C'est une syntaxe que j'ai trouvé dans un post.

    J'ai aussi une procédure qui me permet de charger la dll en question

    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
     
     
     TMaFonc = Function(params : array of Const) : variant;
     
     
    Procedure TMDC_Application_M.Appeler_Dll(Nom_dll, Nom_proc : string; params : array of Const);
    var
      Handle : THandle;
      i : integer;
      MaFonction : TMaFonc;
    begin
      Handle:=LoadLibrary(Pchar(Nom_dll));     //chargement de la dll
      if Handle <> 0 then
      begin
        try
          //Charge dynamiquement la fonction de la dll
          @MaFonction:=GetProcAddress(Handle,'UneSomme');//PChar(Nom_Proc));
          if @MaFonction <> nil then
            i:=MaFonction(params);
        finally
          FreeLibrary(Handle);
        end;
      end;
    end;
    Donc déjà ça plante au niveau Procedure TMDC_Application_M.Appeler_Dll(Nom_dll, Nom_proc : string; params : array of Const);
    car il ne comprend pas le Array of Const. et dans la procédure ou je rempli mon params je ne peux pas non plus déclarer la variable.

    Si je remplace le tout par un Array of variant, l'appel à la fonction, dans la dll, ne marche pas.

    Help

    merci pour tout
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    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 862
    Points : 11 323
    Points
    11 323
    Billets dans le blog
    6
    Par défaut
    vu un post il y a peu : regarde du côté de varargs
    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 !

  3. #3
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Je vais voir ce que je peux trouver là dessus, merci.

    Par contre je n'ai rien dans mon aide Delphi sur ce point ;(
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    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 862
    Points : 11 323
    Points
    11 323
    Billets dans le blog
    6
    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 !

  5. #5
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    merci, j'avais trouvé ce post déjà ^^

    Je vous tiens au courant de mon avancé pour le moment incertaine
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut Re: Procedure et fonction avec nombre et type de param indéf
    Citation Envoyé par SkYsO
    Donc déjà ça plante au niveau Procedure TMDC_Application_M.Appeler_Dll(Nom_dll, Nom_proc : string; params : array of Const);
    car il ne comprend pas le Array of Const.
    Essai avec cf. la fonction VarIsType.
    A l'avenir merci d'indiquer les messages d''erreurs rencontrés.

    Paramètres tableau ouvert variant

    Les paramètres tableau ouvert variant permettent de transmettre un tableau d'expressions de types différents à une seule routine. Pour définir une routine utilisant un paramètre tableau ouvert variant, spécifiez array of const comme type du paramètre. Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     procedure DoSomething(A: array of const);
    déclare une procédure appelée DoSomething qui peut agir sur des tableaux de données hétérogènes.

    La construction array of const est équivalente à array of TVarRec. TVarRec, déclaré dans l'unité System, représente un enregistrement avec une partie variable qui peut contenir des valeurs de type entier, booléen, caractère, réel, chaîne, pointeur, classe, référence de classe, interface et variant. Le champ VType de TVarRec indique le type de chaque élément du tableau. Certains types sont transmis comme pointeur et non comme valeur ; en particulier les chaînes longues sont transmises comme Pointer et doivent être transtypées en string.

    L'exemple suivant utilise un paramètre tableau ouvert variant dans une fonction qui crée une représentation sous forme de chaîne de chaque élément transmis et concatène le résultat dans une seule chaîne. Les routines de manipulation de chaînes utilisées dans cette fonction sont définies dans l'unité SysUtils.
    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
     
     function MakeStr(const Args: array of const): string
    var
      I: Integer;
    begin
      Result := '';
      for I := 0 to High(Args) do
         with Args[I] do
            case VType of
                vtInteger:  Result := Result + IntToStr(VInteger);
                vtBoolean:  Result := Result + BoolToStr(VBoolean);
                vtChar:     Result := Result + VChar;
                vtExtended: Result := Result + FloatToStr(VExtended^);
                vtString:   Result := Result + VString^;
                vtPChar:    Result := Result + VPChar;
                vtObject:   Result := Result + VObject.ClassName;
                vtClass:    Result := Result + VClass.ClassName;
                vtAnsiString:  Result := Result + string(VAnsiString);
                vtCurrency:    Result := Result + CurrToStr(VCurrency^);
                vtVariant:     Result := Result + string(VVariant^);
                vtInt64:       Result := Result + IntToStr(VInt64^);
      end;
    end;
    Il est possible d'appeler cette fonction en utilisant un constructeur de tableau ouvert. Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MakeStr(['test', 100, ' ', True, 3.14159, TForm])
    renvoie la chaîne
    'test100 T3.14159TForm'

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    je pense qu'il serait util de mettre un separateur dans la chaine resultante afin de pouvoir inverser le processus

    sinon un pchar suffit largement pour le passage de paramettre

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Merci et désolé pour le multiPost.

    Donc ça marche très bien tout ça.


    Une derniere question : Est ce que des je peux aussi écrire des dlls en C qui pourront servir de plugin, à mon appli Delphi, avec ce système ?
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SkYsO
    Merci et désolé pour le multiPost.
    C'est comme les goto faut éviter
    Citation Envoyé par SkYsO
    Donc ça marche très bien tout ça.
    Pour confirmation ( pour la FAQ) l'usage du TVarRec régle ton pb sous D6 ?


    Citation Envoyé par SkYsO
    Une derniere question : Est ce que des je peux aussi écrire des dlls en C qui pourront servir de plugin, à mon appli Delphi, avec ce système ?
    La gestion de la pile est différente dans ce cas, là c'est la solution proposée dans l'autre post cité.
    Mais le mieux c'est d'essayer

  10. #10
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Pour confirmation ( pour la FAQ) l'usage du TVarRec régle ton pb sous D6 ?
    Oui cela marche assez bien avec ça pour D6
    Je vais tester les différents types.

    Bon par contre si je veux aussi utiliser du C, je pourrais pas.
    Je vais tacher de reprendre l'autre post.

    Merci en tout cas.

    ps : à bas les goto ^^ (et les multiposts)
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

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

Discussions similaires

  1. Fonction avec nombre d'arguments variables
    Par cjacquel dans le forum Débuter
    Réponses: 5
    Dernier message: 03/02/2015, 15h29
  2. Macro-fonction avec nombre de paramètres non fixé
    Par miasseu dans le forum Macro
    Réponses: 2
    Dernier message: 31/08/2012, 16h36
  3. Réponses: 5
    Dernier message: 11/08/2011, 14h12
  4. Réponses: 9
    Dernier message: 15/05/2007, 12h41
  5. Réponses: 3
    Dernier message: 05/09/2006, 00h47

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