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 :

DLL : passage d'une version delphi N-1 à une autre plus récente


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut DLL : passage d'une version delphi N-1 à une autre plus récente
    Bonjour,
    j'ai une DLL créée en delphi 3, j'essaie de la passer en delphi 7.
    A la compilation : pas de pb. (La dll compilée avec D7 fait qd même 200ko de + que la dll compilée avec D3).
    Par contre lorsque le prog exe appelle la DLL : plantage : 'access violation...'.

    Y-a-t-il qqe chose à faire en particulier ?

    Merci

  2. #2
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Je ne me souviens plus si Delphi 3 travaillait encore avec des ShortString (255 caractères maximum) ou si on était déjà passé aux chaînes de caractères étendues.

    S'il travaillait avec des shortstring, maintenant les chaînes de caractères sont gérées différemments.

    Pour utiliser ce type de chaînes comme paramètre dans une fonction d'une DLL (ou comme valeur de retour...), il faut que la DLL et l'application cliente fassent appel à l'unité ShareMem. Cette dernière doit se trouver en premier dans la liste des uses du projet.

    Fait une recherche dans l'aide en ligne sur ShareMem.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    j'ai essayé mais ça ne vient pas de là....
    Dans mes fonctions exportées de la dll, j'ai des types 'PChar'.
    Non je ne vois vraiment pas ce qu'il ne va pas.

  4. #4
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    En dehors des strings, il y a le même problème si la DLL et l'appli s'échangent des blocs mémoires.

    Je veux dire par là, si l'un alloue le bloc et que l'autre le libère, ou que la DLL utilise des tableaux dynamiques (enfin je ne crois pas que ça existait déjà en D3).

    Sinon ben il reste à déboguer pour trouver ce qui provoque l'AV : Essaie de faire une nouvelle fonction dans la DLL avec la même signature mais qui ne fait rien et regarde si tu as déjà l'AV.

    Si ce n'est pas le cas, ben y plus qu'à trouver ce qui provoque l'AV dans la fonction appelée. Essaie de tout mettre en commentaire et réactive le code petit bout par petit bout...

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    le "long" string sont arrivées avec Delphi 2

    est-ce que ta DLL utilise des objets, des tableaux ou des string en paramètre ? utilise-t-elle ShareMem ?

    si tu peux répondre non à toutes ces questions, elle ne devrait pas poser de pb de compatibilité.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    mes fonctions de la dll sont comme la suivante :

    Function fct1(Com : PChar; FileIn : PChar; FileOut : PChar;
    var Line :integer; var Obs : LongBool): LongBool; export;

    Petite précision : ça plante dès que je lance l'appli. Je ne peux même pas suivre pas à pas dans le code pour voir où ça plante. Même en mettant un point d'arrêt au niveau le + haut du prog.
    En utilisant la DLL compilé en D3, ça marche.
    En cherchant sur le net, j'ai pê trouvé qqe chose : est-ce que ça ne viendrait pas d'un composant active X a installé sur ma DLL compilé en D7 ?

  7. #7
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Petite précision : ça plante dès que je lance l'appli.
    Précision utile en effet. Donc j'imagine que la DLL est importée de façon statique (Pas de LoadLibrary avec des GetProcAddress).

    Si ça plante au lancement, ça veut probablement dire que ça plante dans du code d'initialisation de la DLL (clause initialization d'une des unité ou bloc begin end du projet de la DLL il me semble).

    Tu dois quand même pouvoir déboguer la DLL :
    - Dans Delphi définie la DLL comme projet courant et l'application comme application hôte.
    - Lance l'exécution de la DLL en pas à pas avec F7. Delphi devrait lancer l'appli et s'arrêter sur la première ligne exécutée dans la DLL.

  8. #8
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    En cherchant sur le net, j'ai pê trouvé qqe chose : est-ce que ça ne viendrait pas d'un composant active X a installé sur ma DLL compilé en D7 ?
    Je ne vois pas pourquoi, si c'était le cas tu aurais le même problème avec D3.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    dans mon appli exe principale, je déclare les fcts de la dll comme cela :

    Function fct1(Com : PChar; FileIn : PChar; FileOut : PChar;
    var Line :integer; var Obs : LongBool): LongBool; external 'maDLL.dll';

    Lorsque je mets toutes les déclarations des fcts de la dll en commentaire : ça plante dès le démarrage. Même si je mets un point d'arrêt juste après le begin du fichier .dpr : je n'y passe pas.

    J'ai essayé de le lancer de la DLL. Je lui attache l'exe de l'appli principale puis F9. Ca plante direct. Je n'ai pas essayé avec F7. Dans la DLL il n'y a que des fonctions qui ne sont pas appelées dès le démarrage de l'appli. Elles sont appelées + tard sur un appui bouton.

    Au sujet de active X : j'ai vu que certain avait eu des pb lors d'un changement de version de delphi avec les active X. Mais je ne pense pas que se soit mon pb avec ma DLL.

    Mon fichier exe est rattaché à la DLL. Avec D3, la DLL lui convient, avec D7 elle ne lui convient pas. J'ai regardé avec un view dependancy, la DLL de D7 semble correcte, elle a les mêmes noms de fcts qu'avec celle de D3, rien ne me choque avec un view dependancy.

    Il y a aussi la différence de taille entre les 2 DLLs : presque 200 ko.
    Peut-être des options différentes entre les 2 DLLs, le problème est que je n'ai pas D3 sur ma machine...

    là je suis coincé.

  10. #10
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    Slt

    Moi, j'ai des DLL en D7, et des applis en D2 qui les utilisent.
    Cela marche, meme avec des composants dans les Dll,
    qui n'existent pas en D2.

    Par contre dans les DLL, les functions sont déclarées de la façon suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Function fct1(Com : PChar; FileIn : PChar; FileOut : PChar;
    var Line :integer; var Obs : LongBool): LongBool; StdCall;
    et dans l'applie, la declaration est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Function fct1(Com : PChar; FileIn : PChar; FileOut : PChar;
    var Line :integer; var Obs : LongBool): LongBool;StdCall;External 'madll.dll';
    Peut etre dois tu ajouter le "stdcall".
    En D3 je l'ajoutait aussi, il me semble

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    j'ai essayé avec les 'stdcall', ça ne marche pas non plus.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    autre chose que j'ai testé :

    j'ai créé un prog exe qui appelle une fonction de ma dll sur appui d'un bouton.

    Lorsque je mets l'appel de ma fct en commentaire : pas de pb, l'appli ne plante pas.

    Lorsque l'appel de la fct n'est pas mis en commentaire : ça plante, ça fait un 'access violation' juste après le begin dans le .dpr. Ce n'est même pas l'appel de la fonction qui plante vu que je n'y arrive même pas. Par contre le fait de mettre la fct dans le prog fait planter l'appli.

    J'ai essayé de déclarer les fonctions dans la DLL avec un stdcall ou sans stdcall : même résultat.
    Il y a qqe chose qui ne passe pas, j'ai essayé de regarder certains type de variable : par exemple remplacer des 'longbool' par des 'boolean' : sans succès.

    Autre chose dans les options du projet : onglet 'Compilateur' : je suis bien en alignement 1 byte : il me semble que c'est correct (?).

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    visiblement ta DLL plante dès le chargement...

    tu peux essayer 2 choses

    1) tu prend un projet vierge, tu lui colles un bouton avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Button1Click(Sender:TObject);
    var
     dll:THandle;
     prc:procedure(...); stdcall; // avec les paramètres de ta procédure
    begin
     dll:=LoadLibrary('MaDLL.DLL'); 
     if dll=0 then RaiseLastOSError;
     prc:=GetProcAddress(dll,'MaProcedure');
     prc(...);
    end;
    en toute logique l'application devrait planter sur le LoadLibrary et le RaiseLastOSError peut te donner une indication sur la raison du plantage...ou pas

    2) ensuite, tu reprend l'execution de ce projet mais sous Dependency Walker histoire de voir si y'a pas quelque chose de particulier.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/07/2012, 16h53
  2. Réponses: 2
    Dernier message: 21/10/2010, 10h15
  3. Réponses: 5
    Dernier message: 08/11/2007, 23h21
  4. Une version de linux pour une machine assez ancienne.
    Par Muesko dans le forum Distributions
    Réponses: 8
    Dernier message: 06/07/2006, 17h37

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