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 :
Ce code se déroule sans problème.
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.
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 :
L'erreur provient du Assign fait dans l'application, une erreur "EConvertError avec le message 'Impossible d'affecter TJPEGImage à TPicture'.".
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;
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)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.
- 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
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
Partager