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 :

[Delphi] Problème avec une DLL


Sujet :

Langage Delphi

  1. #1
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut [Delphi] Problème avec une DLL
    Bonjour j'ai créé il y a queleque temps une DLL en pascal (avec DELPHI 2005) et aujourd'hui je doit l'utiliser pour un projet particulier ou j'aurai besoin de la charger en paralèlle... A la manière d'une classe en POO je voudrais etre capable de la charger plusieur fois....

    En fait c'est une DLL qui permet de faire, entre autre, des sauvegardes dans un fichier texte.... et je voudrai etre capable de la charger par exemple 10 fois pour me générer au final 10 rapport texte différents..

    J'ai essayé de renommer ma DLL avec 10 nom différent et de les charger dans mon programme mais cela ne marche pas un seul fichier et créé (car les variable intene a ma DLL ne correponde qu'a un seul emplacement mémoire et non 10 emplacement différents...

    Quelqu'un voit-il comment je peux faire?

    Merci d'avance...

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    A mon avis c'est plus un problème de conception. Si tu as des procédures dans ta DLL qui ont des valeurs fixes (en particulier des noms de fichiers), pourquoi ne pas passer les noms de fichiers en paramètres de la procédure au lieu de les coder en dur ? Ainsi tu gagneras en fléxibilité, lors de l'utilisation de ta DLL.

  3. #3
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    Ben c deja fais... Tout ce fait par paramètre passé aux fonctions....
    Mais si j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      cheminSauvegarde(nomFichier: string);
      begin
         chemin:= nomFichier;  //rangement en variable globale
      end;
    Si j'appelle N fois cette fonction avec des noms différents le nom donné lors de l'appel N vas écraser celui donné lors de l'appel N-1 car en mémoire ca correspond à un seul emplacement. (c'est pas la meme chose que si on a une classe qu'on instancie N fois et ou les variables se retrouveront dupliquées N fois en mémoire)

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Bne oui c'est logique. Si chemin est une variable globale à la DLL, et que la DLL est chargée qu'une seule fois, chemin sera écrasé à chaque appel... Il ne faut donc pas utiliser de variable globale dans ton cas...

  5. #5
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    tu crois que si j'ai aucune variable glogale ca marchera?

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Normalement oui, c'est fait pour ça une DLL

  7. #7
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    mais je pense pas que le problème vienne de la...
    Regarde...Suposons que j'ai une DLL qui dispose de deux fonctions:
    - une fonction qui calcul la somme de 2 entiers et me renvoie le resultat
    - une fonction qui permet de sauvegarder le résultat

    Soit le source:
    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
     
       add (a: integer, b:integer): integer; stdcall;
       begin
          add:= a+b;
       end;
     
       sauvegarde(nomFichier: string): stdcall;
       var
         fichier: textFile;
       begin
         AssignFile(fichier,nomFichier);
         reset(fichier);
         writeln(fichier,a+b); 
       end;
    exports add, sauvegarde;
    Comment faire pour sauvegarder le résultat de a+b si je passe pas par des variable globale?????

    Ps: il est vrai qu'ici je pourai faire le calcul et tout de suite la sauvegarde mais dans le cas de ma DLL c'est impossible. En plus c'est une DLL incluant une fiche pour le composant TXmlDocument (elle génére de l'XML).

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Si tu dois utiliser plusieurs procédures, pourquoi ne pas les enchainer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       add (a: integer, b:integer): integer; stdcall;
       begin
          add:= a+b;
       end;
     
       sauvegarde(nomFichier: string): stdcall;
       var
         fichier: textFile;
       begin
         AssignFile(fichier,nomFichier);
         reset(fichier);
         writeln(fichier, add(a+b)); 
       end;
    exports add, sauvegarde;
    Comme ça c'est beaucoup plus flexible et tu ne passes pas par des variables locales. Ca doit être le même problème pour tes noms de fichiers

  9. #9
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    Je suis tout a fait d'accord avec toi.. Mais dans mon cas c'est impossible car entre l'appel de ma premiere fonction (création du répertoire et du fichier de sauvegarde du XML) et l'appel de ma derniere fonction (sauvegarde du fichier) j'ai plusieurs fonctions qui peuvent etre appelées N fois et dans un ordre différent en fonction de problème donné...
    Il est donc pas possible de définir dans ma DLL l'ordre d'exécution des fonctions et donc je suis "obligé" (enfin j'ai rien trouvé d'autre) de passer par des variables globales....

  10. #10
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Ok... Je vois deux solutions alors :

    - soit tu passes le nom de fichier à toutes procédures, au du moins un handle vers un fichier,
    - soit tu stockes les handles dans un tableau en variable globale, tout en trouvant un moyen pour retoruver le bon fichier...

    La solution du passage des handles est la plus simple pour moi, à vu de nez

  11. #11
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bonjour,

    Tu utilises de manière incorrect le principe des DLL. Une DLL n'est pas destinée à stocker des infos mais à offrir une interface avec une bibliothèque de fonctions appelables par différentes entités.
    Une DLL ne devrait avoir aucune variable globale, sauf dans un but d'interopérabilité entre les différentes entités en mesure d'appeler la DLL. De plus, rien ne peut garantir qu'un autre programme ne va pas utiliser ta DLL et appeler une fonction.

    Tu dois donc complètement repenser ta manière de procéder : elle est foireuse, si je puis me permettre

    Si une fonction renvoie un résultat, alors elle doit le fournir au programme appelant, ou tout au moins lui donner le moyen d'accéder à ce résultat (en utilisant de la mémoire dynamique par exemple).

    @++

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

Discussions similaires

  1. Aide avec une dll delphi pour mirc
    Par SiSMik dans le forum IRC / mIRC
    Réponses: 1
    Dernier message: 14/01/2014, 16h38
  2. Réponses: 1
    Dernier message: 18/04/2012, 11h08
  3. Problème avec une DLL construite en Delphi
    Par steph_1 dans le forum Langage
    Réponses: 6
    Dernier message: 24/01/2008, 10h01
  4. Appeler une API sans liaison avec une DLL
    Par mat.M dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 13/07/2004, 02h22
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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