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 :

Fonction de DLL non reconnue


Sujet :

Langage Delphi

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Fonction de DLL non reconnue
    Bonjour,

    J'ai développé une DLL qui tourne parfaitement depuis longtemps.
    J'y ai ajouté une fonction et la compilation de la DLL s'effectue normalement en appelant l'exécutable cité en paramètre.
    Naturellement la fonction est déclarée dans la partie exports du projet DLL.

    Dans l'exécutable dans l'unité où je déclare les fonctions de DLL j'ai régulièrement déclaré cette dernière du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Machin_FaisQuelquechoseOk( BMPPtr: HBitmap;
                                      const Target: TTrucTarget;
                                      const Good: single;
                                      Res: TChosePtr ):Boolean;
                    stdCall; external Ma_DLL.dll';
    J'ai 7 autres fonctions de la même DLL qui sont appelées dans ma Form principale (dans laquelle mon unité DLL est déclarée en uses) déclarées dans la même unité qui ne posent aucun problème.

    A la compilation de l'exécutable si je n'appele pas cette nouvelle et 8ème fonction je n'ai aucun problème et les appels des 7 autres fonctions s'exécutent. Mais si j'ajoute un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if Machin_FaisQuelquechoseOk(Bmp.Handle, CurTarget, 1.0, @CurChose) then ...
    Delphi refuse de compiler et me signale que ma nouvelle fonction est un identifacateur non déclaré.

    C'est à ni rien comprendre !!!

    Les DLL seraient-elle limitées en nombre de fonctions ?

    Si quelqu'un a une idée ?

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut
    Tu es sûr que ton exe fait appel à la bonne DLL ?
    Je veux dire : tu es sûr que la DLL que tu compiles, est bien celle chargée par l'exe (même répertoire).

    Je me suis déjà fait avoir plein de fois ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Oui !!!

    Je viens de vérifier, et si la DLL ne comprenait pas le fonction appelée ce serait un autre message d'erreur du genre absence de point d'appui dans la DLL

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par colorid Voir le message
    si la DLL ne comprenait pas le fonction appelée ce serait un autre message d'erreur du genre absence de point d'appui dans la DLL
    Ca ce serait un message d'erreur à l'exécution.
    Mais puisque tu es face à une erreur de compilation, je dirais simplement que la déclaration de ta fonction Machin_FaisQuelquechoseOk n'est pas visible à l'endroit où tu l'appelles. D'où le message d'identificateur non déclaré.

    @+ Claudius

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Ok mais alors pourquoi les 7 autres fonctions DLL qui se trouvent dans la même unité et sont appelées de la même Form fonctionnent sans problème ?

    J'ai même essayé sans succès de déclarer la fonction non plus dans l'unité réservée aux déclarations DLL mais dans la l'unité Form... Message "non décléré"

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Montre-nous le code où tu déclares tes fonctions ainsi que l'appel à cette fameuse fonction. On devrait mieux avancer, car là difficile d'apprécier la situation.

    @+

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Voici deux fonctions déclarées dans l'unité de gestion de la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function PCPrint_ColorGamutFromImage( const BMPPtr:HBitmap;
                              const Color: TColor;
                              const ColorExclude: TColor;
                              const DeValue: single):TPeekGamutSerigraph;
                    stdCall; external 'PCPrint_1.dll';
     
    function PCPrint_ControlSeriGraphOk( BMPPtr: HBitmap;
                                      const Target: TPeekGamutSerigraph;
                                      const Good: single):TPeekControl12647;
                    stdCall; external 'PCPrint_1.dll';
    Voici deux appels à ces fonctions à partir de MainForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        BMP:= TBitmap.Create;
        try
         BMP.PixelFormat:= pf24bit;
         BMP.LoadFromFile(ImgFileName);
         GraphGamut:= PCPrint_ColorGamutFromImage(BMP.Handle,C,ShapeExclude.Brush.Color,10);
         ImageWork.Cursor:= crDefault;
         ImageWork.Picture.LoadFromFile('BMP.BMP');
        finally
          BMP.Free;
        end;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        BMP:= TBitmap.Create;
        try
          BMP.PixelFormat:= pf24bit;
          BMP.LoadFromFile(ImgFileName);
          CurControl:= PCPrint_ControlGamutOk(BMP.Handle,GraphGamut,1.0);
          Label1.Caption:= FloatToStrF(CurControl.DeltaE2k,ffFixed,5,2);
        finally
          BMP.Free;
        end;
    Le premier appel ne pose pas de problème, le second bloque à la ligne CurControl:= ...

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    D'un côté tu déclares deux fonctions: PCPrint_ColorGamutFromImage et PCPrint_ControlSeriGraphOk.
    De l'autre tu appelles deux fonctions: PCPrint_ColorGamutFromImage (OK) et PCPrint_ControlGamutOk (?).

    Là j'ai bien un identificateur non déclaré sur PCPrint_ControlGamutOk. Serait-ce une inattention aussi bête que cela ?

    @+

  9. #9
    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
    à la lecture rapide je soupçonne ceci :

    l'unité qui déclare les fonctions de la DLL est construite sur ce modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    unit udll;
    interface
     
    procedure proc1;
    procedure proc2;
     
    implementation
     
    procedure proc1; external 'truc.dll';
    procedure proc2; external 'truc.dll';
    procedure proc3; external 'truc.dll';
    end.
    les procédures 1 et 2 sont visibles, pas la 3ième
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok
    Mille excuses.

    En fait j'utilise les unités d'un développement précédent qui se trouvent dans un répertoire différent. Je ne m'en suis pas rendu compte mais les mises à jour que je faisais sur cetaines unités étaient inscrites dans 'unité de même nom mais dans un répetoire différent !

    La problème est donc résolu

  11. #11
    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
    Citation Envoyé par colorid Voir le message
    Mille excuses.

    En fait j'utilise les unités d'un développement précédent qui se trouvent dans un répertoire différent. Je ne m'en suis pas rendu compte mais les mises à jour que je faisais sur cetaines unités étaient inscrites dans 'unité de même nom mais dans un répetoire différent !

    La problème est donc résolu
    Pour éviter ce genre de blagues, je spécifie toujours le chemin d'accès de toutes les unités du projet dans le fichier .DPR !
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/12/2014, 16h48
  2. [XSLT 2.0] xmlns:op (xquery operators) - fonction "subtract-yearMonthDurations()" non reconnue
    Par VforVincent dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/05/2011, 10h04
  3. Fonction DLL non reconnu en 4D
    Par Stirius dans le forum 4D
    Réponses: 0
    Dernier message: 03/11/2008, 15h28
  4. Fonctions en français non reconnues
    Par tvieil dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/08/2008, 10h06
  5. Réponses: 7
    Dernier message: 18/03/2007, 02h13

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