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 :

Problème avec un Timage dans une DLL


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 Problème avec un Timage dans une DLL
    Bonjour,

    J'ai écrit une fonction qui intervient sur une TImage en changeant quelques pixels de couleur du tyme Function faisQuelqueChose( IMG : TImage;...):boolean;

    Cette fonction s'exécute sans problème quand elle est écrite et appelée dans une unité de l'application.

    Si je la déplace dans une DLL elle déclenche une erreur du type EInvalidOperation avec le message "Une image ne peut être modifiée que si elle contient un bitmap"

    Or elle contient un bitmap !

    Quelqu'un peut-il m'expliquer ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 548
    Points : 25 118
    Points
    25 118
    Par défaut
    En même temps, un TImage n'a rien à faire dans une DLL, c'est un composant visuel si c'est uniquement du traitement d'image
    Un TBitmap serait plus approprié, ou un TPicture pour gérer d'autres formats !

    Sinon transmettre des objet VCL entre DLL, je suis obligé de le faire en ce moment, mais c'est vraiment un truc que je n'aime pas, surtout si cet objet est modifié par la DLL alors que c'est l'EXE qui le créé ou inversement.
    J'ignore si avec un TImage cela oblige d'avoir ShareMem ou FastShareMem ? Pour le AnsiString c'est obligatoire, pour le reste, je ne suis pas familier de ces pratiques.
    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 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 Avec un bitmap j'ai déjà essayé
    Avec le bitmap voici le code principal de la fonction DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // BMP est un bitmap adressé en paramètre à la DLL
      for j := 0 to BMP.Height-1 DO
      begin
        row  := BMP.Scanline[j];
        Bar.Position:= J;
        Bar.update;// ProgressBar passé en paramètre
        for i := 0 to BMP.Width-1 do
        begin
    //      OK est fonction de quelque chose
          If not OK Row[i]:= ExcludeTriple;// Ce pixel change de couleur
        end;
      end;
    end;
    Le BMP devrait être changé car OK est à true un grand nombre de fois qui sont comptées dans une varaible retournée
    Or le BMP ne change pas si la fonction est dans une DLL si elle est dans une unité de l'application ça marche, mais il faut que cette fonction soit dans une DLL protégée par une clé car confidentielle

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 548
    Points : 25 118
    Points
    25 118
    Par défaut
    Je serais toi !
    J'utiliserais un Buffer !
    Copie via TImage.Picture.SaveToStream dans un TMemoryStream

    Appel Exe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .Picture.SaveToStream(MemoryStream) 
    faisQuelqueChose(MemoryStream.Memory, MemoryStream.Size);
    .Picture.LoadFromStream(MemoryStream)
    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
    procdure faisQuelqueChose(Img: Pointer, ImgLen: Integer)
     
    MS := TMemoryStream.Create();
    try
      MS.Write(Img, ImgLen);
      MS.Seek(0, soFromBeginning);
      B := TBitMap.Create();
      try
        B.LoadFromStream(MS);
     
        //...calcul...
     
        MS.Seek(0, soFromBeginning);
        B.SaveToStream(MS); 
        if ImgLen = MS.Size then     
          Move(MS.Memory, Img, ImgLen);
        else
          result := ben merde alors !
      finally
        B.Free();
      end;
    finally
      MS.Free();
    end;
    certe, il y a plus de mémoire de consommer, puisqu'il y a une copie d'un MemoryStream dans l'Exe, une autre Copie dans la DLL, puis une affectation à un Bitmap (ouch 4 exemplaires)



    Faudrait voir avec les Handles de Windows, il est possible, que l'on puisse échanger des Handle


    Appel Exe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Img := Bitmap.Picture.ReleaseHandle();
    faisQuelqueChose(Img)
    Picture.Bitmap.Handle := Img;
    la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procdure faisQuelqueChose(var Img: HBITMAP)
      B := TBitMap.Create();
      try
        B.Handle := HBITMAP;
     
        //...calcul...
     
        Img := B.ReleaseHandle(); // ? faudrait pas qu'il libère l'image, il y a un compteur de référence et tout ça !
      finally
        B.Free();
      end;
    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

  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 Gros Problème
    A la ligne 2
    .Picture.SaveToStream(MemoryStream)
    Il génère une erreur "Impossible d'accéder au symbole protected TPicture.SaveToStream"

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 548
    Points : 25 118
    Points
    25 118
    Par défaut
    Ce n'est pas un code prêt à l'emploi, je l'ai tapé directement sur le forum, sans même le testé !

    Bon, je suppose que tu avais toi même corrigé entre temps, que c'est le SaveToStream du Bitmap
    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

  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 Ok
    Avec le handle du bitmap ça marche !

    Merci !

    je coche résolu

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

Discussions similaires

  1. problème avec l'apostrophe dans une requête
    Par mika0102 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/03/2019, 16h51
  2. Problème avec API OutText dans une DLL
    Par KlausGunther dans le forum API, COM et SDKs
    Réponses: 20
    Dernier message: 11/05/2014, 15h55
  3. [Delta3d] probléme avec un objet dans une map
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 27/03/2006, 14h49
  4. Problèmes avec un TWebBrowser dans une DLL
    Par bellamyjc dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/01/2005, 22h35
  5. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 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