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 :

Callback depuis une DLL écrite en Visual C++


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 312
    Par défaut Callback depuis une DLL écrite en Visual C++
    Bonjour,
    Je voudrai savoir comment appelr une focntion delphi depuis une dll ecrite avec microsoft visual C++.
    Lors de mes essaies, bien que les deux debogueurs , celui de borland et de microsoft m'indiquent les mêmes adresses des procédures , lors de l'appel, un acces violation est émis en lieu et place.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
     
      TProcHisto=procedure ( Lien : Integer;
                            SsModule: PChar;
                            Message: PChar);
     
      TCallBack = procedure ( idAlarme : integer ; Etat : integer ) ;
     
     
      // Parametres pour l'initialisation
      TParamsInit = record
          Indexconnexion : integer;
          AdresseIP : array [0..15] of char;
          CallBack  : TCallback;
          CallBackHisto : TProcHisto;
      end ;
     
     
    procedure Tmonobjet.btConnexionClick(Sender: TObject);
    var
      tmpParams : TParamsInit;
    begin
         tmpParams.Indexconnexion := 0;
         StrPLCopy(tmpParams.AdresseIP,tbAdresse.Text,length(tbAdresse.Text));
     
         // Mes 2 callbacks
         tmpParams.CallBack := DoCallBAck;
         tmpParams.CallBackHisto := DoCallBackHisto;
     
         // Invocation de la methode d'initialisation de ma dll
         NS_Initialisation ( @tmpparams );
         btEnvoyer.Enabled := True;
     
         test := 0;
    end;
    Mon code 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    // callback 1
    typedef void (*TCallback)(int,int);
     
     
    // callback 2
    typedef void (*TCallBackHisto)(int, char*, char*);
     
    struct TParamsInit
    {
    	int iIndexConnection;
    	char AdresseIP[16];     // adresse IP du PABX
    	TCallback Callback;
    	TCallBackHisto CallBacHisto;
     
    };
     
    EXPORTATION  DWORD TYPE SYS_InitDLL( struct TParamsInit * Params )
    {
     
    	// CONSTRUCTION DE L'OBJET
    	Lien = new CLienPABX ();
    	strncpy ( Lien->AdresseIP , Params->AdresseIP,16);
    	Lien->ParamInit = Params;
    	Lien->InitLien();
     
    	// 
       return 0;
     
    ...
     
    // plus tard l'appel dans l'objet clienPABX 
    ParamInit->Callback(0,0);
    // Retourne acces violation
    }

  2. #2
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,
    à mon avis il doit y avoir un problème avec les conventions d'appel des fonctions. Sous Delphi, la convention par défaut est Register et sous C++ sûrement cdecl (ou une autre selon les options de compilation).
    Il faut donc les harmoniser des deux côtés, sinon les paramètres ne seront pas correctement passés (registre ou pile, de gauche à droite ou inversement), de même que nettoyés (par l'appelant ou l'appelé).
    Sous Windows la convention qui est utilisé pour les API et qui est supporté par quasiment tous les langages à destination de cette plateforme s'appelle stdcall.

    Ce qui donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TProcHisto=procedure( Lien : Integer; SsModule: PChar; Message: PChar); stdcall;
     
    TCallBack=procedure( idAlarme : integer ; Etat : integer ); stdcall;
    et
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // callback 1
    typedef void (__stdcall *TCallback)(int,int); 
     
    // callback 2
    typedef void (__stdcall*TCallBackHisto)(int, char*, char*);

    [EDIT]Autre problème,
    ta variable tmpParams : TParamsInit; est locale donc libéré à la sortie de la fonction, hors le code C++ semble garder un pointeur dessus pour visiblement la lire plus tard . Soit il te faut la recopier dans le code C++, soit la conserver dans le code Delphi.

Discussions similaires

  1. Peux on utiliser depuis Delphi 5 win32 une dll écrite en .net?
    Par korntex5 dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/08/2009, 17h46
  2. Réponses: 5
    Dernier message: 08/09/2005, 20h33
  3. Réponses: 6
    Dernier message: 21/06/2005, 21h45
  4. Comment charger un TFrame depuis une dll ?
    Par Millenod dans le forum Langage
    Réponses: 29
    Dernier message: 22/12/2004, 14h48
  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