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 :

Paramètres fonction DLL


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Paramètres fonction DLL
    Bonjour,
    je souhaite développer une DLL afin de rendre accessibles mes fonctions Delphi à plusieurs programme.
    Je teste ma DLL avec un projet Excel VBA et je rencontre certains problèmes dans les passages de paramètres : lors du lancement de la fonction EstVide, l'erreur suivante est levée :
    Erreur d'exécution '-2147417848 (80010108)':
    Erreur automation
    L'Objet invoqué s'est déconnecté de ses clients.


    Voici le code de ma DLL Delphi :
    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
     
    library LpFonctions;
     
    uses
      ComServ,
      SysUtils,
      Classes,
      UCompteur,
      UFonctions;
     
    {$R *.res}
     
    function ValeurSuivante(): Pchar;
    var
      zTmp: string;
    begin
      zTmp := UCompteur.ValeurSuivante;
      Result := PAnsiChar(zTmp);
    end;
     
    function EstVide(var sChaine: PChar): Boolean;
    begin
      Result := UFonctions.EstVide(sChaine);
    end;
     
    exports
      DllGetClassObject,
      DllCanUnloadNow,
      DllRegisterServer,
      DllUnregisterServer,
      ValeurSuivante,
      EstVide;
     
    begin
    end.
    Code VBA utilisant la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Declare Function ValeurSuivante Lib "C:\LpFonctions.dll" () As String
    Private Declare Function EstVide Lib "C:\LpFonctions.dll" (sChaine As String) As Boolean
     
    Private Sub CommandButton2_Click()
    Dim s1 As String
     
      If Not EstVide("1e2") Then
        TextBox1.Text = ValeurSuivante
      Else
        TextBox1.Text = ""
      End If
    End Sub
    Y-a-t-il une erreur d'utilisation de types dans les paramètres ?

  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 : 55
    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 466
    Points
    28 466
    Par défaut
    alors je ne sais pas trop comment VB gère les variable string en retour...mais ce qui est clair c'est que la chaine zTmp est libérée par Delphi en fin de fonction !

    le paramètre de EstVide ne devrait pas être préfixé "var"

    je te propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
     sGlobal:string;
     
    function ValeurSuivante(): Pchar;
    begin
      sGlobal := UCompteur.ValeurSuivante;
      Result := PAnsiChar(sGlobal);
    end;
     
    function EstVide(sChaine: PChar): Boolean;
    begin
      Result := UFonctions.EstVide(sChaine);
    end;
    personnellement j'utilisais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function GetString(Len:integer; Str:pchar):boolean;
    begin
     StrLCopy(...)
    end;
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Declare Function GetString Lib "madll.dll" (Len As Integer, sChaine As String) As Boolean
     
     a$=space$(250) ' allocation de la chaine
     GetString(250,a$)

    tu peux aussi prévoir de retourner la longueur de chaine réelle etc...

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    En fait la fonction ValeurSuivante fonctionne correctement.
    Mon problème est lié à la fonction EstVide.

    Je ne comprends pas l'utilisation de GetString.

    J'ai supprimer le var devant le paramètre de la fonction EstVide.
    Et j'ai fait le test suivant en VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub CommandButton2_Click()
    Dim s1 As String
      s1 = Space$(250)
      If Not EstVide(ByVal s1) Then
        TextBox1.Text = ValeurSuivante
      Else
        TextBox1.Text = ""
      End If
    End Sub
    Une erreur est levée : Convention d'appel de DLL incorrecte.

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    En testant avec un paramètre de type double, cela fonctionne.
    Le problème provient effectivement du passage de paramètre de type string.

    DLL Delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function EstVide(sChaine: double): Boolean;
    begin
      Result := UFonctions.EstVide(floattostr(sChaine));
    end;
    VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub CommandButton2_Click()
    Dim s1 As Double
      s = 12
      If Not EstVide(s1) Then
        TextBox1.Text = ValeurSuivante
      Else
        TextBox1.Text = ""
      End If
    End Sub

  5. #5
    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 : 55
    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 466
    Points
    28 466
    Par défaut
    il doit manquer un stdcall sur la déclaration des fonctions Delphi

    j'ai un projet VBA qui fonctionne comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function Download(Source,FileName:PChar):integer; stdcall; 
    begin
     ...
    end;
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Declare Function Download Lib "WORD400.DLL" (ByVal SourceName As String, ByVal FileName As String) As Integer
     
     If Download("LIB/FILE.MEMBER", "C:\XWORD.TXT")=0 Then
      MsgBox ("ok")
     End If

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Bien vu, avec le stdcall; cela fonctionne.
    Merci beaucoup Paul.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/06/2010, 11h58
  2. Réponses: 1
    Dernier message: 18/09/2009, 12h25
  3. Récupérer paramètre fonction
    Par masseur dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 26/06/2006, 12h51
  4. [PowerBuilder] Fonction DLL en dynamique
    Par deltar dans le forum Powerbuilder
    Réponses: 1
    Dernier message: 30/01/2006, 15h25
  5. Appels fonctions DLL
    Par Micka91 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 17/02/2004, 18h32

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