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 :

problème avec dll de ressource


Sujet :

Delphi

  1. #1
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut problème avec dll de ressource
    Bonjour,

    Je veux mettre un jpg dans une dll pour ensuite la récupérer en chargeant dynamiquement la dll.

    Voici le code de la dll :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    library testdll2;
     
    uses
      SysUtils,
      Classes,
      Windows, //constante RT_RCDATA
      jpeg, //TJpegImage
      ExtCtrls; //TImage
     
    {$R testdll2.res}
    {$R imgs.RES} <- contient le jpg 
     
    function getJpg() : TJpegImage; stdcall;
    var
      Stream : TCustomMemoryStream;
    begin
      Result:= TJpegImage.Create;
      Stream := TResourceStream.Create(hInstance, 'Clouds', RT_RCDATA);
      try
        Result.LoadFromStream(Stream);
      finally
        Stream.Free;
      end;
    end;
     
    exports
      getJpg;
     
    begin
    end.
    Ce code se déroule sans problème.
    Si j'utilise ce code dans une appli avec un MonTImage.Picture.Assign(MonJpg) derrière, cela passe sans problème.

    Voici le code de l'application test :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    procedure TForm1.Button1Click(Sender: TObject);
    var
      HandleDLL: THandle;
      getJpeg : function() : TJpegImage; stdcall;
      jpg : TJpegImage;
    begin
      try
        // récup fonction getjpg dans variable getJpeg
        getJpeg:= LierFonction(HandleDLL, 'getJpg');
        // si la fonction est bien récupérée, on l'utilise
        if assigned(getJpeg) then begin // NB : ca passe bien dans le if
          jpg:= getJpeg(); // ca passe, jpg a bien quelquechose
          Image1.Picture.Assign(jpg); // ca couille à l'exécution
         // testé avec :  Image1.Picture:= jpg;
        end;
      finally
        FreeLibrary(HandleDLL);
        FreeAndNil(jpg);
      end;
    end;
     
    /// Renvoie un pointeur sur la fonction de la DLL indiqué par HandleDLL et dont le nom est NomFonction
    function TForm1.LierFonction(var HandleDLL: THandle; NomFonction: String): Pointer;
    begin
      //Valeurs de retour par défaut
      Result:= nil;
      HandleDLL:= 0;
     
      //Chargement de la DLL. On récupère son handle
      HandleDLL:= LoadLibrary(pAnsiChar('testdll2.dll'));
     
      //Si le chargement a échoué, on sort
      If HandleDLL = 0 then
        Exit;
     
      //Renvoi de l'adresse de la fonction voulue
      Result:= GetProcAddress(HandleDLL, pAnsiChar(NomFonction))
    end;
    L'erreur provient du Assign fait dans l'application, une erreur "EConvertError avec le message 'Impossible d'affecter TJPEGImage à TPicture'.".


    Qu'est-ce qui ne va pas là-dedans ??
    On ne peut pas utiliser un TJpegImage ou un TImage comme valeur de retour d'une fonction dans une dll ?


    Renseignements annexes :

    J'ai tenté en utilisant en TImage comme valeur de retour mais sans succés, même erreur.
    Cependant

    Ce que contient mon objet jpg à l'exécution juste avant l'assignation qui fait l'erreur :
    (propriété -> valeur)
    • Empty -> false
    • Height -> 172
    • Modified -> True
    • Palette -> 0
    • PaletteModified -> True
    • Transparent -> False
    • Width -> 300
    • OnChange -> nil
    • OnProgress -> nil
    • Bitmap -> quelquechose
    • ProgressiveEncoding -> False
    • CompressionQuality -> 90
    • PixelFormat -> jf24Bit
    • ProgressiveDisplay -> False
    • Performance -> jpBestQuality
    • Scale -> jsFullSize
    • Smoothing -> True
    Le contexte : j'ai une appli avec des images et des chaînes de caractères qui apparraissent un peu partout dans l'application. Ses éléments doivent être personnalisable : mettre des jpgs, icônes, chaînes de caractères dans une ressource et que l'application load ça au démarrage si la ressource est présente.
    Pas possible d'après ce que j'ai vu en Delphi Win32 contrairement au .NET (avec un resourcemanager). Par contre, ça correspond mieux à une dll. Voilà le pourquoi des ressources dans une dll.

    NB : c'est ma première dll
    --
    Arnaud DANEELS

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Et si t'essayais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1.Picture.Assign(TPicture(jpg));
    à la place de ça...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1.Picture.Assign(jpg);
    (j'espère que ça va marcher,car j'ai fait ça "au pif")
    Et si ça marche,dans ton tableau de bord,clique sur
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    En fait, cela provenait d'une erreur de portée et non de conversion.

    code qui marche sur la portion du code de l'application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if assigned(getJpeg) then begin
      jpg:= TJPEGImage.Create;
      getJpeg(sNomImg, jpg);
      Image.Picture.Assign(jpg);
    end;
    explication en français : il ne faut pas créé le TJpegImage dans la dll mais dans l'application elle-même.
    --
    Arnaud DANEELS

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

Discussions similaires

  1. [WD14] Problème avec DLL ecrite en Visual Basic
    Par SonnyB dans le forum WinDev
    Réponses: 21
    Dernier message: 07/11/2011, 15h48
  2. Problème avec DLL (développée en C++)
    Par MarsOran dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 14/06/2009, 20h04
  3. Problème Avec dll
    Par rzayani dans le forum Visual C++
    Réponses: 1
    Dernier message: 20/04/2007, 21h51
  4. Problème avec dll win32com
    Par jbidou88 dans le forum Langage
    Réponses: 2
    Dernier message: 28/08/2006, 14h06
  5. conteneur de la STL (problème avec DLL et COM)
    Par moldavi dans le forum MFC
    Réponses: 8
    Dernier message: 25/07/2005, 22h43

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