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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    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 confirmé 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
    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 ;(

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    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 confirmé 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
    Par défaut
    merci, j'avais trouvé ce post déjà ^^

    Je vous tiens au courant de mon avancé pour le moment incertaine

  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
    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 491
    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 491
    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

  8. #8
    Membre confirmé 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
    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 ?

  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
    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 confirmé 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
    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)

+ 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