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:
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:
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:lol: