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

Delphi Discussion :

Utilisation d'une dll C++ en Delphi


Sujet :

Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Utilisation d'une dll C++ en Delphi
    Bonjour!
    J'en utilisant des Dlls C++ en Delphi, avec des types simples des donnes ça fonctionne très bien,
    même pour des arrays des types simples des donnes (integer, Extended), mais lorsque je tente utiliser des types arrays (vecteur) des types complexes des donnés cela ne fonctionné pas. voilà un exemple ci-dessous

    extern "C"
    {

    int doProduct(TVarRec Handle[])
    {
    cout<<Handle[0].VInteger<<endl;
    cout<<Handle[1].VInteger<<endl;
    cout<<sizeof(Handle); //sizeof(Handle)=4 sizeof(Handle[0]) =72 sizeof(Handle[1]) =72 bug delphi sizeof(Handle[2]) =72 it doesn't exist
    return 0;
    }
    }

    Je m'explique, j'en train de recevoir un tableau de TVarRec à partir du Delphi, la Dll doit traitée cet tableau de TVarRec, avec mon code je vois ne que le premier élément du tableau (Handle[0].VInteger), les autres sont tous égales à zero, alors c++ n' identifie pas les autres éléments.

    Vous savez comment on solutionne ce problème? à mon avis c'est un problème de la taille des donnés.

  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
    Quel est le code d'export de la fonction Delphi?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Cela est le code en Delphi et au-dessous du code delphi je mettrais la structure que j'avais fait en C++ pour qu'il puisse reconnaître TVarRec. Merci d'avance

    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
    36
    37
    38
    39
    40
    41
    42
    43
    //To select a mode de compilation
    {$IFDEF FPC}
    {$mode objfpc}{$H+}
    {$modeswitch objectivec1}
    {$ENDIF}
     
    uses
      FastSharemem,
      Windows,
      U_Small_Lib in 'U_Small_Lib.pas',
      System.SysUtils;
     
    type
      TArr_VarRec=array of TVarRec;
      TdoProduct = function (AArr_Parameters:array of const):integer;cdecl;
      TLibHandle = System.THandle;
     
    var
      ldoProduct:TdoProduct;
      lHandle:TLibHandle;
      lVarRecInput: TArr_VarRec;
      lVarRecOutput:TArr_VarRec;
      x:integer;
      test_int: array  of integer;
    const
      NilHandle = TLibHandle(0);
     
    begin
      lHandle := LoadLibrary('C:\Users\preparateur\Desktop\Delphi_and_CPP_Tests\Test_fin\dlls\test.dll');
      if lHandle <> NilHandle then
      begin
        @ldoProduct := Get_Dll_Function_Adress(lHandle, 'doProduct');
        if @ldoProduct <> nil then
        begin
            Setlength(lVarRecInput,10);
            lVarRecInput[0].VInteger:= 15;
            lVarRecInput[1].VInteger:= 10;
            ldoProduct(lVarRecInput);
            writeln(#13#10,'There are: ',sizeof(PChar),' parameters');
        end;
      end;
      sleep(1000);
    end.
    Structure C++
    Code C++ : 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
    struct TVarRec 
    {
      int           VInteger;
      unsigned      VType;
      bool          VBoolean;
      char          VChar;
      long double*  VExtended;
      string *      VString;
      void*         VPointer;
      char*         VPChar;
      void*         VObject;
      void*         VClass;
      wchar_t       VWideChar;
      LPWSTR        VPWideChar;
      void*         VAnsiString;
      void*         VCurrency;
      void*         VVariant;
      void*         VInterface;
      void*         VWideString;
      uint64_t*     VInt64;
      void*         VUnicodeString;
    };

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut DELPHI/C++
    Bonjour,

    Si tu utilises une version récente de Delphi, tu peux aussi mixer le C++ et Object Pascal dans une même appli

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Bonjour,

    Si tu utilises une version récente de Delphi, tu peux aussi mixer le C++ et Object Pascal dans une même appli
    Merci bien,
    La DLL est écrite en C++, elle doit travailler comment une boîte noir. J'aimerais bien pouvoir mixer, mais pour normes
    techniques je ne peux pas

  6. #6
    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
    Je viens de relire ton premier message, je ne suis pas sûr d'avoir tout compris. Je récapitule, dis-moi là où je me trompe:
    - tu as des dll faites en Delphi
    - tu les utilises avec Delphi c'est ok
    - tu les utilises avec C++ ce n'est pas ok.

    A priori, je dirais que le TVarRec n'est pas un type interropérable. Utilises un autre type de structure.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  7. #7
    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 445
    Points
    28 445
    Par défaut
    je plussois Linkin, ne serais-ce que dans la déclaration "array of const", Delphi ajoutera implicitement un paramètre indiquant la longueur du tableau (voir ici), alors que la déclaration C++ TVarRec[] ne donne pas cette information.

    d'autre part je ne comprend pas ce que SizeOf(PChar) fait dans cette ligne : "writeln(#13#10,'There are: ',sizeof(PChar),' parameters');"

    TVarRec n'a d'intérêt que pour passer des paramètres de types différents, pour passer des Integer un simple array of Integer suffira, et la déclaration se fera comme ceci

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int doProduct(int terms[], int count)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function doProduct(terms: PInteger; Count: Integer): Integer;
     
    var
      terms: array of Integer;
    begin
      SetLength(terms, 2);
      terms[0] := 15;
      terms[1] := 10;
      doProduct(@terms[0], Length(Terms));
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Je viens de relire ton premier message, je ne suis pas sûr d'avoir tout compris. Je récapitule, dis-moi là où je me trompe:
    - tu as des dll faites en Delphi
    - tu les utilises avec Delphi c'est ok
    - tu les utilises avec C++ ce n'est pas ok.

    A priori, je dirais que le TVarRec n'est pas un type interropérable. Utilises un autre type de structure.
    Oui c'est la première option on fait des Dlls en C++ et les utilises avec Delphi, soit delphi l'Application.
    J'avais essayé aussi l'inverse mais il n'est pas possible faire des Dlls en Delphi et utiliser en C++,
    alors nous sommes d'accord.
    Les phase de la procédure sont elles:

    -On charge la Dll C++
    -On récupéré la fonction qu'on veut utiliser
    -Delphi donne les paramétrés
    -C++ traite exécute la Dll e donne le résultat à Delphi


    Voilà les étapes du projet

    On peut utiliser tous les types des donnes, même des vecteurs ou matrices des données,
    sauf dans le cas où le vecteur est un vecteur de TVarRec et je suis oblige à les utiliser.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    je plussois Linkin, ne serais-ce que dans la déclaration "array of const", Delphi ajoutera implicitement un paramètre indiquant la longueur du tableau (voir ici), alors que la déclaration C++ TVarRec[] ne donne pas cette information.

    d'autre part je ne comprend pas ce que SizeOf(PChar) fait dans cette ligne : "writeln(#13#10,'There are: ',sizeof(PChar),' parameters');"

    TVarRec n'a d'intérêt que pour passer des paramètres de types différents, pour passer des Integer un simple array of Integer suffira, et la déclaration se fera comme ceci

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int doProduct(int terms[], int count)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function doProduct(terms: PInteger; Count: Integer): Integer;
     
    var
      terms: array of Integer;
    begin
      SetLength(terms, 2);
      terms[0] := 15;
      terms[1] := 10;
      doProduct(@terms[0], Length(Terms));
    end;
    Merci pour la réponse, en effet le logiciel de l’entreprise que je travaille fonctionne avec ne que des structures de TVarRec, parce qu'ils ne savent pas quel type de donnée ils vont recevoir et ni la taille, alors je dois recevoir une vecteur de TVarRec et je dois le traite en C++ et après renvoyer. Je n'ai pas le choix, je ne sais pas s'il sera possible finir ce projet. J'avais vu déjà l'article (http://rvelthuis.de/articles/articles-openarr.html) et j'avais testé des autres types de vecteurs (chaines d'int, chaines d'extended) tous fonctionnent, sauf ceux que j'ai besoin (TVarRec array)

    "writeln(#13#10,'There are: ',sizeof(PChar),' parameters');" Cette ligne n'ai pas d'importance désole c'est ma faute.

    Ils ont dit pour essayer avec SAFEARRAY, je vais essayer et après je vous donne la réponse, si vous avez des conseils s'il vous plaît revenez vers moi.
    Merci en avance

  10. #10
    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 445
    Points
    28 445
    Par défaut
    peu importe si ce sont des TVarRec, il ne faut pas déclarer un "array of"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function doProduct(terms: PVarRec; Count: Integer): Integer;
     
    var
      terms: array of TVarRec;
    begin
      SetLength(terms, 2);
      terms[0] := 15;
      terms[1] := 10;
      doProduct(@terms[0], Length(Terms));
    end;
    au fait, dans le code il manque l'usage de TVarRec.VType qui indique le type de donnée...et d'ailleurs la déclaration C++ de TVarRec est erronée, c'est un "union" de ces valeurs !

    en fait on a 2 long, le premier pouvant être un pointeur ou un long selon la valeur du second donnant le type de valeur

    Code c++ : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    static const Shortint vtInteger 
     = 0x0; 
     
    static const Shortint vtBoolean 
     = 0x1; 
     
    static const Shortint vtCharacter 
     = 0x2; 
     
    static const Shortint vtExtended 
     = 0x3; 
     
    static const Shortint vtString 
     = 0x4; 
     
    static const Shortint vtPointer 
     = 0x5; 
     
    static const Shortint vtPChar 
     = 0x6; 
     
    static const Shortint vtObject 
     = 0x7; 
     
    static const Shortint vtClass 
     = 0x8; 
     
    static const Shortint vtWideChar 
     = 0x9; 
     
    static const Shortint vtPWideChar 
     = 0xa; 
     
    static const Shortint vtAnsiString 
     = 0xb; 
     
    static const Shortint vtCurrency 
     = 0xc; 
     
    static const Shortint vtVariant 
     = 0xd; 
     
    static const Shortint vtInterface 
     = 0xe; 
     
    static const Shortint vtWideString 
     = 0xf; 
     
    static const Shortint vtInt64 
     = 0x10;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    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 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par edudesantana
    J'avais essayé aussi l'inverse mais il n'est pas possible faire des Dlls en Delphi et utiliser en C++
    Ah bon ? Je pense que tu ne parles pas en général, mais dans ton cas particulier seulement ?
    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 !

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Ah bon ? Je pense que tu ne parles pas en général, mais dans ton cas particulier seulement ?
    En général C++ ne peut pas recevoir des Dlls des autre langages, en raison à la manière de compilation, il fait une conversion ABI (Application Binary Interface), donc chaque compilateur fait une conversion, ça résulte en incompatibilité, soit pour dlls des autres langages, soit pour dlls C++ générés d’après autre compilateurs.

    Si vous utilisez les codes que j'avais fait ci-dessus vous pouvez utiliser des Dlls C++ en utilisant une application Delphi, elle peut utiliser tous les types de donnés, sauf "array of TVarRec", alors mon problème commence, parce que mon logiciel envoie que ça. Donc je ne peux pas travailler avec les Dlls C++

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2015, 10h23
  2. Utilisation d'une DLL C# en Delphi
    Par ilbas dans le forum Outils
    Réponses: 1
    Dernier message: 28/06/2012, 16h51
  3. Utilisation d'une DLL créée en DELPHI
    Par JP.NUAGE dans le forum Langage
    Réponses: 6
    Dernier message: 03/06/2008, 11h40
  4. Utilisation d'une DLL Delphi en ASP
    Par [DreaMs] dans le forum ASP
    Réponses: 1
    Dernier message: 08/11/2006, 00h11
  5. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19

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