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 :

appel DLL C++ en Delphi (pb avec type)


Sujet :

Langage Delphi

Vue hybride

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 17
    Par défaut appel DLL C++ en Delphi (pb avec type)
    Bonjour,

    Je dois appeler une fonction d'une dll C++ en Delphi.
    Mais j'ai des pb avec les types (notamment "typedef BYTE RSI_TEMPLATE[9]").
    Je ne sais pas d'autres part comment initialiser ma structure delphi avant de la passe à la fonction.
    Faut-il attribuer de la mémoire ???, ect ...


    code c++ (fichier .h)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //déclaration de la fonction à appeler
    RSI_DLL RSI_RESULT RSI_API rsiGetUserRecord(byte id, RSI_USER_RECORD FAR* ur);
     
    //les types
    typedef BYTE RSI_TEMPLATE[9];
    typedef struct
    {
    	byte					id;
    	RSI_TEMPLATE 			templateVector;
    }	RSI_USER_RECORD;

    Mon Code 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
     
    //déclaration de la  fonction 
    function rsiGetUserRecord(Userid : byte; userRec:RSI_USER_RECORD) :integer; stdCall; external ...
     
    //délaration des types delphi
      RSI_TEMPLATE=array[1..9] of byte;
     
      RSI_USER_RECORD=record
    		ID : byte;
    		templateVector : RSI_TEMPLATE;
      end;
     
    //appel de la fonction
    var
     userRec:RSI_USER_RECORD;
    begin
      //pour le user ayant id=1
      result := rsiGetUserRecord(1,userRec);
     
    //--> erreur "Violation d'accès à l'adresse .. ds le module rsi32.dll..."
    end;
     
    merci pour votre aide

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Par défaut
    C'est un pointer qu'il faut passer en paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result := rsiGetUserRecord(1,@userRec);
    Il peut avoir aussi un problème d'alignement. Essai cela si cela ne marche toujours pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RSI_USER_RECORD=packed record
          ID : byte;
          templateVector : RSI_TEMPLATE;
    end;

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Par défaut
    Bonjours,

    Je suis pas trop sûr que ça changera quelque chose, mais deux points :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type 
         RSI_TEMPLATE = array[1..9] of byte;
    C'est faux. En C, RSI_TEMPLATE[9]; équivaut a un tableau de 9 entrée, commençant a 0, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type 
         RSI_TEMPLATE = array[0..8] of byte;
    devrait mieux marcher.

    Ensuite, la fonction C attend un pointeur sur le premier élément du tableau.
    Donc rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type
      PRSI_USER_RECORD = ^RSI_USER_RECORD
    et défini la fonction ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    function rsiGetUserRecord(Userid: Byte; userRec: PRSI_USER_RECORD) : Integer; stdcall;
    J'espère que ça va marcher, mais je ne suis pas trop sûr de moi ...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Par défaut
    C'est faux. En C, RSI_TEMPLATE[9]; équivaut a un tableau de 9 entrée, commençant a 0
    Tant que l'on accède pas aux elements du tableau dans le code delphi, le déclarer en [0..8], [1..9] ou [90..98] revient exactement au même.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Par défaut
    D'accord, j'en était pas trop sûr, mais bon, j'ai dit une grosse bétise

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 17
    Par défaut
    Faut-il allouer de la mémoire à userRec ou juste déclarer une variable userRec, et la passer à la focntion ?

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Par défaut
    Non si tu déclares un record et que tu passe l'adresse en parametre, oui si tu déclares un pointeur

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 17
    Par défaut
    Merci ca à l'air de fonctionner pour cette fonction.
    J'en ai encore moult autre à faire, mais ca va se ressembler.

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

Discussions similaires

  1. Comment exécuter une DLL écrite en Delphi avec RunDLL32 ?
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 09/01/2008, 19h03
  2. Appel DLL managé en delphi
    Par bdurtaut dans le forum C++/CLI
    Réponses: 1
    Dernier message: 25/10/2007, 08h54
  3. Réponses: 1
    Dernier message: 11/04/2007, 11h45
  4. DELPHI. Problème avec Soap et une DLL.
    Par SER dans le forum Delphi
    Réponses: 1
    Dernier message: 01/03/2007, 10h58
  5. [Delphi] Problème avec une DLL
    Par Jayceblaster dans le forum Langage
    Réponses: 10
    Dernier message: 23/04/2006, 16h33

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