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 :

dll c++ et delphi


Sujet :

Langage Delphi

  1. #1
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut dll c++ et delphi
    Bonjour à tous !!!

    j'ai developpé un algorythme de hashage en c++ que j'ai testé directement depuis devcpp et ça fonctionne.
    Je l'ai mis en dll et je l'ai compilé, aucun problème.
    Je crée une interface en delphi dans lequel j'apelle ma dll crée en c++ et le problème est que j'ai une erreur lorsque que j'apelle la fonction de la dll.

    j'obtient le message (violation d'accès dans hash.dll).
    Je pense que le problème doit venir d'une compatibilité des string en c++ et delphi.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     code de la dll
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <sstream>
    #define EXPORT extern "C" __declspec&#40;dllexport&#41;
    ........
    EXPORT std&#58;&#58;string hash&#40;string nom, string taille&#41;
    &#123;
    .........
    std&#58;&#58;ostringstream retour;
    retour << std&#58;&#58;hex << h&#91;0&#93; << h&#91;1&#93; << h&#91;2&#93; << h&#91;3&#93; << h&#91;4&#93;;
    return retour.str&#40;&#41;;
    &#125;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    le code en delphi
      function hash&#40;nom&#58; string; taille&#58; string&#41;&#58;Pansichar; stdcall; external 'hash.dll' name 'hash';
     
    var
      Form1&#58; TForm1;
     
    implementation
     
    &#123;$R *.dfm&#125;
    &#123;APP CONSOLE&#125;
    procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
    begin
    resultat.Text&#58;= hash&#40;fichier_texte.Text, taille_texte.Text&#41;;
    end;
    merci d'avance pour votre aide

  2. #2
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156

  3. #3
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    Oui j'ai regardé, ça explique comment charger la dll. j'ai testé si je fais un printf depuis ma dll ça sort en mode console sous delphi. la dll est donc correctement appelé. je pense pas que le problème vienne de l'appel à la dll.

    Après des multiples tests je pense que c'est un problème de type.

    c'est quoi l'equivalent de std::string en delphi ???

    impossible de voir les équivalence de type. j'ai beau avoir cherché, je trouve comment changer le type dans c++ ou delphi mais pas quel sont les équivalence

  4. #4
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Logiquement (mais je n'ai pas essayé), si tu mets bien en place ce qui est dit en I.3. (le sharemem et la dll), cela devrait fonctionner.

    Aussi non, aucune idée, désolé

  5. #5
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    ça ne fonctionne pas

    Je sait plut quoi faire

  6. #6
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 89
    Points
    89
    Par défaut
    A mon avis le type string en C++ et string en delphi est totalement différent.

    Le plus simple serait de passer par des pointeur sur chaine pour ne pas avoir de soucis :

    char * dans le C (ou C++)
    et PChar en delphi.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 44
    Points : 52
    Points
    52
    Par défaut
    Salut,

    D'après ton code, tu utilises le "qualificatif" stdcall dans la déclaration de la fonction dans delphi. Mais ce qualificatif n'est pas utilisé lors de la définition de la fonction dans la dll.
    Je crois que le problème peut venir de là. Tu devrais déclarer la fonction en "stdcall" en c++ et en delphi.

    De plus, je crois, comme "dd16" qu'il risque d'avoir des problèmes de compatibilité dans l'utilisation des strings entre c++ et delphi. l'utilisation de char* paraît plus appropriée.

    Bon ce n'est qu'une piste mais ...

    Si cela ne résoud pas ton problème, je crois que tu devrais d'abord tester l'appel de la fonction de ta dll en devcpp (et pas seulement faire l'appel de la fonction en direct - d'après ce que j'ai compris de ton message).
    Faire ce test d'appel de dll c++ par c++ te permettrais de savoir si le problème est dû à la compatibilité "définition-utilisation" de dll ou "définition devcpp-utilisation delphi" de dll.
    En fonction du résultat, tu pourras rechercher la solution adaptée.
    Pour le moment les possiblités de source d'erreurs semblent multiples pour être sûr de la résoudre du premier coup.

    MDUSE

  8. #8
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    En vérifiant, je peut récupéré la valeur de la fonction. Petit problème je récupérais toujours la meme variable du hash quelque soit la variable envoyé à la fonction.

    Il semblerais qu'en delphi on récupère les char* par pchar. par contre pour envoyer si c'est en pchar pour une récupération char* en c++ ça bug. j'obtient toujours 3 lettre bizarres

    donc:

    C++ (char*) --> delphi (pchar) OK
    delphi (pchar) --> C++ (char*) c'est pas bon

    comme je trouve pas de solution je vous donne le code au complet. ça fais 2 jour que je suis bloqué

    DLL en C++ (testé avec un exe crée en C++ ça marche correctement)
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <sstream>
    #define EXPORT extern "C" __declspec&#40;dllexport&#41;
     
    // Parametres
    using namespace std;
     
    // Déclaration des variables
    unsigned short int i;
    unsigned short int y;
    short int k;
    short unsigned int z;
    unsigned int t;
    int h&#91;5&#93;;
    int a;
    int b;
    int c;
    int d;
    int e;
    unsigned short int mask;
    unsigned int s;
    unsigned int K;
    unsigned int temp;
    unsigned int ft;
    string retour;
    //string nom = "Mou";
    //string taille = "che";
    std&#58;&#58;string mot;
     
    union u_init
    &#123;
        unsigned short int entier&#91;16&#93;;
        char carac&#91;64&#93;;    
    &#125;;
     
    unsigned int S&#40;unsigned short int n, unsigned int x&#41;
    &#123;
        x = &#40;x << n&#41;|&#40;x >> 32-n&#41;;
        return x;        
    &#125;
     
    EXPORT char* hash&#40;char* mot&#41;
    &#123;
        // déclaration des variables
        union u_init init;
        // mise en place du mots
        z = 0;
        i = 8*9;
        k = 448 - &#40;i + 1&#41;;
        if &#40;k < 0&#41;
        &#123;
            k += k + 512;     
        &#125;
        char * nomchar = new char&#91;40&#93;;
        strncpy&#40; nomchar, mot, 40 &#41;;
        y = i/8;
        y = y-1;
        while &#40;z <= y&#41;
        &#123;
            init.carac&#91;z&#93; = nomchar&#91;z&#93;;
            ++z;
        &#125;
        init.carac&#91;z&#93; = 0x80;
        z += 1;
        y = k/16;
        y = y + z;
        while &#40; z <= y&#41;
        &#123;
            init.carac&#91;z&#93; = 0x00;
            z += 1;
        &#125;
        y = 32 - &#40;i/8&#41; + 8;
        init.carac&#91;y&#93; = i;
        h&#91;0&#93; = 0x67452301;
        h&#91;1&#93; = 0xefcdab89;
        h&#91;2&#93; = 0x98badcfe;
        h&#91;3&#93; = 0x10325476;
        h&#91;4&#93; = 0xc3d2e1f0;
        // traitement
        a = h&#91;0&#93;;
        b = h&#91;1&#93;;
        c = h&#91;2&#93;;
        d = h&#91;3&#93;;
        e = h&#91;4&#93;;
        mask = 0x0000000F;
        t = 0;
     
        while &#40;t<=79&#41;
        &#123;
            if &#40;t <= 19&#41;
            &#123;
               K = 0x5A827999;     
            &#125;
            if &#40;&#40;t >19&#41; && &#40;t <= 59&#41;&#41;
            &#123;
               K = 0x8F1BBCDC;       
            &#125;
            if &#40;&#40;t >60&#41; && &#40;t <= 79&#41;&#41;
            &#123;
               K = 0xCA62C1D6;
            &#125;
            s = t&mask;
            if &#40;t >=16&#41;
            &#123;
             init.carac&#91;s&#93; = S&#40;1,&#40;init.entier&#91;&#40;s+13&#41;&mask&#93;&#41; xor &#40;init.entier&#91;&#40;s+8&#41;&mask&#93;&#41; xor &#40;init.entier&#91;&#40;s+2&#41;&mask&#93;&#41; xor &#40;init.entier&#91;s&#93;&#41;&#41;;     
            &#125;
            if &#40;t<=19&#41;
            &#123;
             ft = &#40;b&c&#41;|&#40;&#40;!b&#41;&d&#41;;          
            &#125;
            if &#40;&#40;t >= 20&#41; && &#40;t <= 39&#41;&#41;
            &#123;
             ft = b xor c xor d;       
            &#125;
            if &#40;&#40;t >= 40&#41; && &#40;t <= 59&#41;&#41;
            &#123;
             ft = &#40;b&c&#41;|&#40;b&d&#41;|&#40;c&d&#41;;
            &#125;
            if &#40;t >=60&#41;
            &#123;
             ft = b xor c xor d;
            &#125;
            temp = S&#40;5,a&#41; + ft + e + init.carac&#91;s&#93; + K;
            e = d;
            d = c;
            c = S&#40;30,b&#41;;
            b = a;
            a = temp;
            if &#40;t == 79&#41;
            &#123;
            h&#91;0&#93; = h&#91;0&#93;+a;
            h&#91;1&#93; = h&#91;1&#93;+b;
            h&#91;2&#93; = h&#91;2&#93;+c;
            h&#91;3&#93; = h&#91;3&#93;+d;
            h&#91;4&#93; = h&#91;4&#93;+e;
            std&#58;&#58;ostringstream retour;
            retour << std&#58;&#58;hex << h&#91;0&#93; << h&#91;1&#93; << h&#91;2&#93; << h&#91;3&#93; << h&#91;4&#93;;
            std&#58;&#58;string test&#40;retour.str&#40;&#41;&#41;;
            string&#58;&#58;size_type len;
            len = test.length&#40;&#41;;
            void* teest;
            char * out;
            teest = malloc&#40;sizeof&#40;char&#41;*40&#41;;
            out = &#40;char*&#41;teest;
            strncpy&#40;out, test.c_str&#40;&#41;, len&#41;;
            return teest;
            &#125;
            t = t+1;
        &#125;  
    &#125;
    code en 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
    36
    37
    unit unit_main;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class&#40;TForm&#41;
        Button1&#58; TButton;
        fichier_texte&#58; TEdit;
        Fichier&#58; TLabel;
        taille_texte&#58; TEdit;
        Taille&#58; TLabel;
        resultat&#58; TEdit;
        procedure Button1Click&#40;Sender&#58; TObject&#41;;
      private
        &#123; Déclarations privées &#125;
      public
        &#123; Déclarations publiques &#125;
      end;
     
      function hash&#40;mot&#58; pchar&#41;&#58; pchar; external 'hash.dll';
     
    var
      Form1&#58; TForm1;
     
    implementation
     
    &#123;$R *.dfm&#125;
    procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
    begin
      resultat.Text&#58;= hash&#40;'ss'&#41;;
    end;
     
    end.
    il y a des objets en plus dans delphi. normalement je doit récupérer le nom et l'extension pour faire un hash (logiciel de recherche de doublons).

    Merci pour votre aide

  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
    Salut,
    j'ai ajouté ces 2 URL dans la page cours :
    http://delphi.developpez.com/cours/i...hem=Conversion

    En Delphi la convention cdecl est préférable pour utiliser du code C/C++.

Discussions similaires

  1. utiliser dll c++ dans delphi
    Par delphino2006 dans le forum Delphi
    Réponses: 4
    Dernier message: 07/11/2006, 21h19
  2. appel DLL C++ en Delphi (pb avec type)
    Par fkerbourch dans le forum Langage
    Réponses: 7
    Dernier message: 11/07/2005, 18h31
  3. Comment créer une dll Win32 sous Delphi ?
    Par Mickey.jet dans le forum Langage
    Réponses: 8
    Dernier message: 16/06/2005, 16h38
  4. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 11h15
  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, 10h19

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