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 :

Appel dll un peu particulier


Sujet :

Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut Appel dll un peu particulier
    Bonjour

    Ce qui suit va faire crier les puristes car un dll n a pas vocation a etre mie en resources mais ça m evite une install et protege mon appli...dumoins si j'y parviens...

    J ai une dll en resource dans mon exe.
    dans le on create,j extrais cette ressource et la save dans c:\windows (ça ne fonctionne pas avec le repertoire system !) sous un nom generé à chaque ouverture de l appli de maniere aleatoire.(je l efface dans le close query)

    j aimerai savoir comment appeller cette dll.

    quand j apelle une dll j utilise, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NomDLL = '123456.dll';
     
    function nom_fonction(): Integer; stdcall; external NomDLL;
    mais il m est impossible de declarer cela en debut de code...puisque je ne connais pas le nom de ma dll...et que de toutes les façons, au premier lancement elle n existe pas, quelque soit son mon...

    Auriez vous une piste ?

    Merci de votre aide

    stephane

  2. #2
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Je pense qu'il est possible d'avoir le nom de ta DLL dans une virable (globale ?) que tu modifies quand tu exporte ta DLL sur le disque.
    Ensuite pour l'appel, il fraudais utiliser cette variable.

    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
    procedure Dll_Test(Cnx : TSQLConnection;);
    var
       MaDLL : THandle;
       MaFonction : procedure (Cnx : TSQLConnection); stdcall;
    begin
       MaDLL := LoadLibrary(PChar(NomDLL));
       if MaDLL = 0 then
          raise Exception.Create('Le fichier ' + NomDLL + ' est introuvable.');
     
       @MaFonction := GetProcAddress(MaDLL, 'MaFonction');
       if @MaFonction = nil then
          raise Exception.Create('Le fichier ' + NomDLL + ' ne contient pas la fonction demandée.');
     
       try
          MaFonction(Cnx);
       finally
          FreeLibrary(MaDLL);
       end;
    end;

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    merci d avoir pris le temps de me repondre.

    Je comprends l idee mais ai un pb en declarant ma fonction à la place de
    MaFonction : procedure (Cnx : TSQLConnection); stdcall;
    ma fonction dans la dll est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function answer(): Integer; stdcall;
    begin
      Result := random(20);
    end;
    donc je procede ainsi mais cela ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaFonction : function answer(): Integer; stdcall;
    de plus answer n est pas reconnu dans le try...

    Donc comment declarer ma fonction ?

    merci de ton aide

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    je vois pas bien le probleme ?

    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
     
    type
       TanswerFunc = function  : integer; stdcall;
     var
       dllHandle : cardinal;
       answerFunc : TanswerFunc;
       ires : integer;
     begin
       dllHandle := LoadLibrary('ma.dll') ;
       if dllHandle <> 0 then
       begin
         @answerFunc := GetProcAddress(dllHandle, 'answer') ;
         if Assigned (answerFunc) then
           Ires := answerFunc; //call the function
         else
           ShowMessage('"answer" function not found') ;
         FreeLibrary(dllHandle) ;
       end   else   begin
         ShowMessage('ma.dll not found / not loaded') ;
       end;
     end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Tu ne dois pas nommer ta function dans l'appel de la DLL mais seulement la déclarer avec ces paramètres

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    Effectivement je nommais la fonction dans son appel...

    Merci c est parfait, cela repond parfaitement à mes attentes.

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

Discussions similaires

  1. appel a un programme exterieur un peu particulier
    Par KINENVEU dans le forum Général Python
    Réponses: 6
    Dernier message: 06/04/2009, 03h27
  2. Api coredll.dll wifi appel natif "Un peu perdu"
    Par sid_la_chouette dans le forum Mobiles
    Réponses: 0
    Dernier message: 17/12/2007, 07h02
  3. Appel d'un callback sur un event un peu particulier
    Par Jim_Nastiq dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/06/2007, 16h40
  4. [MFC]ActiveX + appel DLL
    Par Xeron dans le forum MFC
    Réponses: 4
    Dernier message: 22/06/2005, 16h39
  5. Réponses: 2
    Dernier message: 05/01/2004, 11h23

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