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 de services C++ importés


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Par défaut Utilisation de services C++ importés
    Bonjour,

    Je débute en DELPHI depuis 2 semaines ...

    Je developpe actuellement une appli sous DELPHI qui doit utiliser les services d'une dll C++, compilée sous BC55.
    J'ai donc déclaré en statique les prototypes de ces services dans mon projet DELPHI avec les mots clés qui vont bien (cdecl, external, name, ....) et la compile passe.

    Exemple de service dans l'API C++ :
    int DECLSPEC _MaFonction ();
    je traduit en Pascal par :
    function _MaFonction : integer; cdecl; external 'malibrairie.dll';

    et à l'execution tout se passe bien.

    En revanche, lorsque je tombe sur un service du type :
    int DECLSPEC _MaFonction(const char * RF_ConfigDescr, const long RF_TailleConfigDescr, int * RF_Status);
    je le transcris en Pascal de la façon suivante :
    function _MaFonction(const RF_ConfigDescr : PChar; const RF_TailleConfigDescr : longint; var RF_Status : integer):integer; cdecl; external 'malibrairie.dll';

    et là, l'exécution, mon projet plante, Windows m'insulte et ma parle d'une erreur de violation d'accès et me propose une fenêtre assembleur à laquelle je ne pipe mot !

    Je soupçonne que le typage que j'utilise n'est pas approprié mais j'ai beau tout essayer, je ne trouve pas le bon.






    Merci de vos réponses....

  2. #2
    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
    hello,

    sinon je ne vois pas d'erreur dans la traduction (mis à part le nom de fonction, mais j'imagine que c'est une erreur de copie :p )

    du coup je pense à la convention d'appel...j'ai toujours pas bien compris comment on indique la convention d'appel en C, mais ne devrais-tu pas utiliser du stdcall au lieu de cdecl ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Par défaut
    Citation Envoyé par Paul TOTH
    hello,

    sinon je ne vois pas d'erreur dans la traduction (mis à part le nom de fonction, mais j'imagine que c'est une erreur de copie :p )
    Oui effectivement, une simple erreur de copie ...

    Citation Envoyé par Paul TOTH
    du coup je pense à la convention d'appel...j'ai toujours pas bien compris comment on indique la convention d'appel en C, mais ne devrais-tu pas utiliser du stdcall au lieu de cdecl ?
    Moi non plus, je n'ai pas tout compris, mais j'ai essayé le stdcall et le problème persiste.

    En revanche, j'ai toujours un doute sur le typage à utiliser lorsque j'apellle une fonction C qui passe un float* en paramètre ....

  4. #4
    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
    Citation Envoyé par Cheb09
    Oui effectivement, une simple erreur de copie ...



    Moi non plus, je n'ai pas tout compris, mais j'ai essayé le stdcall et le problème persiste.

    En revanche, j'ai toujours un doute sur le typage à utiliser lorsque j'apellle une fonction C qui passe un float* en paramètre ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // void proc(float * toto):
     procedure (var toto:single); cdecl;
    // ou
     procedure (toto:psingle); cdecl;
     
    // et double = double :D
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Ce sont les const qui posent problème. En C++ le const ne fait que signaler au compilateur qu'il ne faut pas modifier la variable à l'intérieur de la fonction. En Delphi ça fait ça plus le même effet que le var : un passage par référence.

    Il faudrait donc déclarer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int DECLSPEC _MaFonction(const char * RF_ConfigDescr,
      const long RF_TailleConfigDescr, int * RF_Status);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function _MaFonction(RF_ConfigDescr : PChar;
      RF_TailleConfigDescr : LongInt; var RF_Status : integer) : integer;
      cdecl; external 'malibrairie.dll';
    Bref rappel sur les paramètres const
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    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
    hum...je suis dubitatif

    quand tu passes une structure en paramètre...soit elle est recopiée (pas de préfix), soit elle est modifiable et passée par adresse (var) soit elle est non-modifiable et passée par adresse (const).

    mais pour un PChar, je ne vois pas quelle différence il peut y avoir entre const et sans const...dans les deux cas on passe la valeur d'un pointeur et non l'adresse du pointeur.

    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
     
    procedure p(p:pchar);
    begin
     p[0]:='a';
    // mov byte ptr[eax],$61
    end;
     
    procedure varp(var p:pchar);
    begin
     p[1]:='b';
    // mov eax,[eax]
    // mov byte ptr[eax+1],$62
    end;
     
    procedure constp(const p:pchar);
    begin
     p[2]:='c';
    // mov byte ptr[eax+2],$63
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
     z:array[0..5] of char;
     a:pchar;
    begin
     z:='hello';
     a:=@z;
     p(a);
    // mov eax,[ebp-$0c]
    // call p
     varp(a);
    // lea eax,[ebp-$0c] ; LEA et non MOV !
    // call varp
     constp(a);
    // mov eax,[ebp-$0c]
    // call constp
     ShowMessage(a);
    end;
    ceci donne bien "abclo"

    la différence est uniquement au niveau du "var" qui utilise "@a" au lieu de "a"
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/12/2007, 16h32
  2. Utiliser le service d'indexation windows
    Par GeYinho dans le forum ASP.NET
    Réponses: 6
    Dernier message: 21/06/2007, 16h39
  3. utiliser un service de windows
    Par anisj1m dans le forum Windows
    Réponses: 3
    Dernier message: 21/02/2007, 15h22
  4. Utiliser un service web dans une page ASP
    Par REMACC1 dans le forum ASP
    Réponses: 2
    Dernier message: 30/08/2006, 10h17
  5. utilisation integration services MSSS05
    Par Cape31 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/05/2006, 17h37

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