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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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
    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 Expert

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

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Quel est le code d'export de la fonction Delphi?

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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
    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 Expert

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

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    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.

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    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

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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
    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

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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
    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.

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 539
    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

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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
    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

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