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 :

pb passage de données entre Appli et DLL


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 20
    Points : 14
    Points
    14
    Par défaut pb passage de données entre Appli et DLL
    bonjour,
    j'ai un problème de passage de données entre une DLL et mon appli. La dll a été compilée en Delphi 7 .
    J'ai une appli compilée en D7 et une autre compilée en D5.
    Le paramètre pour passer les données entre la DLL et les applis est une Class assez complexe pour simplifier c'est une Tcollection de Tcollection.
    Quand j'utilise l'appli D7 avec la dll, tout est OK. Par contre quand j'utilise l'appli D5, les données sont complètement erronées (caract. bizaroides, décalage entre les différentes propriétés). Je me suis dit que je devais passer des paramètres plus rudimentaires et je passe maintenant entre mon appli D5 et la DLL un tableau de record contenant lui-même un tableau de record avec des types simples (integer, double et PChar). Mais toujours le même résultat: données erronées en retour dans mon appli D5. Quelqu'un aurait une idée ? Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    bonjour

    rajoute la directive stdcall dans les déclarations des fonctions de la dll
    @+

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    salut WolffN,
    Les stdcall sont bien en place mais toujours le même problême....

  4. #4
    Nouveau membre du Club
    Profil pro
    frTRYER
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : frTRYER

    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Points : 32
    Points
    32
    Par défaut
    Slt,
    As tu vérifié l'alignement de tes records sous Delphi 5 ? Il doit être identique entre ta DLL et ton appli si tu veux que les 2 programmes communiquent.
    Sous Delphi 7 tu peux parameter l'alignement dans les options de compilation du projet. Tu peux aussi le faire dans le code avec les options de compilation : {$A+}, {$A-}, {$A1}, {$A2}, {$A4}, ou {$A8}
    Par contre sous Delphi5 je ne sais pas si ça existe.

    Sinon tu peux aussi voire du côté de la directive packed pour forcer la compression de tes records.

    A+

  5. #5
    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
    salut


    tu recupere quoi de ta dll ?
    si c'est un objet tu risque efectivement d'avoir une incompatibilite
    c'est un peu comme si tu essayer de recupere un objet d'un dll creer avec c++


    @+ Phil
    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

  6. #6
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    Si je ne me trompe pas, si tu veut récuperer un string, tu doit lui donner une taille fixe (string -> string(255).
    A tu une exception de levée lors de la lecture ?
    D7/2007 - Asphyre 4.1

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    1. Ce n'est pas possible de passer des objets entre un programme Delphi et une DLL, même Delphi. Dans ce cas là il faut utiliser des paquets.
    2. Toute utilisation de tableaux dynamiques ou de string non fixés en taille (en bref tout ce qui nécessite une allocation mémoire partagée entre DLL et exécutable) ne peut se faire sans le gestionnaire mémoire de Borland (cf la prose quand tu crées une DLL avec Delphi)
    3. La convention d'appel doit être la même dans la déclaration de la fonction exportée (le plus souvent STDCALL) et côté implémentation
    4. Lorsque tu utilises des PChars, il faut, s'ils ne sont le résultat que de transtypages (i.e. myPChar = pchar(MySTring)) ne les utiliser qu'en lecture côté DLL (autant passer des array [0..n] of char).
    5. Si ca bugge toujours, il faut ton code poste ici...
    "It's more fun to compute !"

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Pour les chaines de caractères, je passais des tableaux fixes de 255 car, mais toujours le même problème. En essayant différentes hypothèse je me suis aperçu que le problème disparaissait (décalage des données et carac. illisibles) quand j'enlevais les var de type Double. J'ai remplacé finalement Double par Single et j'obtiens bien maintenant un tableau de données correct !!!

    Merci à tous et bonne fête de fin d'année

  9. #9
    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
    salut

    je suis desolé de contredire le redacteur mais il est possible de recuperer une instance d'objet dans une dll la seul condition est d'avoir la class declaré dans le programe principale

    @+ Phil
    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

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Je confirme tes dires Anapurna, puisque justement dans le cas cité plus haut j'utilise bien une instance d'objet que je passe en paramètre à la dll et que je lis dans mon appli . ça marche très bien quand le compilateur est le même pour l'appli et la dll: Delphi 7 en l'occurence. La class de l'objet instancié est bien sur la même pour les 2 codes (appli et dll).

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Tu peux me contredire, ca ne me dérange personnellement pas :-) Cependant, je persiste et je signe : sans passer par Sharemem, si ca marche, c'est bien mais ce n'est pas fait pour ca et tu risque d'avoir plein de problèmes, notamment dans l'utilisation des opérateurs IS et AS (si tu les utilise explicitement pas, la VCL compilée côté DLL en fait sûrement usage par contre). Si par exemple tu passes un objet TAbc, chaque module (l'exe et la DLL) est chargé à une adresse virtuelle différente qui ne permet pas de tester de manière valide si l'objet est bon ou pas. Si l'EXE est chargé à l'adresse virtuelle A et la DLL à l'adresse B, chacun voient TAbc comme une classe ayant une adresse différente puisque à TAbc est subsitué une adresse qui dépends de A côté EXE et B côté DLL. L'interopérabilité des objets entre les modules n'est pas chose simple, voilà pourquoi MS à conçu des technologies comme COM pour partager de manière fonctionnelle des objets à base d'interfaces... mais c'est une autre histoire.
    "It's more fun to compute !"

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Effectivement ce que je disais plus haut (passage d'un objet entre dll et appli) est valable seulement si sharemem (ou fastsharemem) est dans les uses des 2

  13. #13
    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
    salut


    je ne nie pas qu'il faille certaine condition mais il aurait ete plus prudent de dire qu'il n'est pas recommander l'usage des object dans une dll plutot que de dire que cela ete impossible

    @+ Phil
    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

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

Discussions similaires

  1. passage de donnée entre form
    Par Albert_le_5_eme dans le forum VC++ .NET
    Réponses: 8
    Dernier message: 24/11/2006, 10h30
  2. passage de données entre formulaires
    Par patbeautifulday1 dans le forum Access
    Réponses: 1
    Dernier message: 30/08/2006, 18h06
  3. passage de données entre page
    Par flatron dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/01/2006, 13h50
  4. passage de pointeurs entre appli delphi et DLL c++
    Par e-teo dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 21h46
  5. Passage de données entre deux pages
    Par spica92 dans le forum ASP
    Réponses: 2
    Dernier message: 08/09/2005, 14h38

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