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 :

Violation d'accès après appel d'une fonction DLL


Sujet :

Langage Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Violation d'accès après appel d'une fonction DLL
    Bonjour à tous,

    Gros problème, j'exécute une fonction de DLL et curieusement si après l'appel j'ajoute une ligne de code de type composant visible := true je déclenche un message d'erreur de violation d'accès !!!! Si cette ligne de code se trouve avant l'appel la fonction de la DLL s'exécute sans message d'erreur.

    Quelqu'un peut-il m'expliquer où est l'erreur ?

    Merci à tous

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Sans code c'est difficile mais je pense que ta fonction de ta DLL modifie une zone mémoire, peut-être le this en cours, ce qui provoque par la suite un bon gros délire !
    Ou alors le Sender, il est souvent dans EAX dans un gestionnaire type OnClick, si ton Sender c'est un bouton (le fameux composant) ou alors Self, ça fait mal aussi !

    J'ai déjà eu des trucs affolants avec une DLL Sybase, impossible de l'utiliser correctement sans VA et il arrivait à trouver des valeurs chaines on ne sait comment (alors que NULL passé pour un char*)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    C'est un peu court pour juger, un extrait du code serait utile.
    La référence du composant devient manifestement invalide.
    Sais-tu ce que fait la fonction appelée dans la DLL ? Est-ce qu'elle libère des objets ou modifie une référence d'objet ?

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  4. #4
    Membre expérimenté
    Avatar de Pascal Fonteneau
    Profil pro
    gérant
    Inscrit en
    Février 2007
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : gérant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2007
    Messages : 139
    Par défaut utilisation de la DDL dans un autre contexte
    Tu peux aussi tester la DLL dans un autre projet, si le problème persiste ,la DLL est surement en cause. Sinon, il est possible que les problèmes viennent de ton source principal,par exemple ecriture à un incide impossible pour un poste d'un tableau, dans ce cas l'exception arrivera lors de l'acces a la partie de code corrompue par ton erreur initiale. J'ai eu ce souci hier ;-)

    a+
    Pascal

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Ça peut simplement être un problème de convention d'appel et de corruption des registres : stdcall.

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ça peut simplement être un problème de convention d'appel et de corruption des registres : stdcall.
    +1, c'est généralement une différence de convention d'appel qui foire la pile.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Merci à tous, voici quelques info complémentaires
    d'abord les prototypes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      // initialisation des limites cubiques
      function quantRGB(Seg: TpkSegRGBCfgPtr): Integer;stdcall;external DLLName;
     
     
      // segmentation cubique sur image
      function SegRGB(Seg:TpkSegRGBCfgPtr;imageName: PAnsiChar; TxtName: PAnsiChar;
                      ICCPtr: TProfil_icc_Ptr; W: TVecDouble): Integer;
                            stdcall;external DLLName;
     
     
      // tri des segments en % décroissant
      function Trie( Seg: TpkSegRGBCfgPtr) : integer;stdcall;external DLLName;
    le code des appels à ces fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      InitSegmentationOk(1,1,1.0,false,True,0,0,0,crSeg);
      Ok:= (quantRGB(@crSeg)=0);
      Ok:= Ok and (SegRGB(@crSeg,PChar(ImgName),PChar('INFO.txt'),@crProfile,W)=0);
          ShowMessage(format('%.d', [crSeg.SegVec[49].PixSize]));
      Ok:= Ok and ( Trie(@crSeg)=0);
      if Ok then DisplaySegmentation;
    Remarques :

    1) Ce code fonctionne sans problème dans une autre version du logiciel développé avec la même unité de déclaration des prototypes
    2) Si je supprime la ligne 4 du dernier extrait de code (suppression du showmessage) l'erreur se produit !
    3) La DLL a été développée en C

    Que faire ?

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Autre version du logiciel ?
    Changement de Delphi entre temps ?

    Ton PChar semble compatible avec du PAnsiChar, donc une version Ansi de Delphi comme la 7 ?

    stdcall ? pas cdecl ?

    Ton problème c'est la suite de Erreur privileged instruction, où tu avais utiliser du String avec une DLL !
    Si cela se trouve cela fonctionne ailleurs parce que tu avais de la chance !

    Une Violation d'Accès c'est retord, il suffit d'ajouter une variable pour décaler tout en mémoire et cela laisse de la place pour que la DLL fasse n'importe quoi sans que l'on sache et parfois ça déborde où il ne faut pas et l'on s'en rend compte !
    Du coup, le "cela fonctionne ailleurs" n'est pas forcément si vrai que cela !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Quid de simplifier le code pour éviter que le compilo ne s'emmêle ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    iRet := SegRGB(@crSeg,PChar(ImgName),PChar('INFO.txt'),@crProfile,W);
    Ok:= Ok and (iRet=0);
    car il se pourrait que le ShowMessage l'oblige à loger autrement les valeurs dans ses registres, ce que ferait pê aussi sa décomposition.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut OK Ca marche
    Merci ShaiLeTroll

    Avec cdecl pas de problème

    Merci à tous

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 03/11/2011, 15h22
  2. Rafraichir un page après appel d'une fonction
    Par friedamichelle dans le forum JSF
    Réponses: 5
    Dernier message: 23/02/2011, 16h00
  3. BCB 6 / Violation d'accès après utilisation d'une DLL
    Par a_lincoln54 dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/04/2008, 14h15
  4. Réponses: 7
    Dernier message: 22/01/2008, 15h18
  5. [FPDF] Erreur après appel d'une fonction avec include
    Par orus8 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 04/11/2005, 10h49

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