Probelm z dllami i bitmapami!

0

Mam taki kod dll'ki:

library bmp;

uses
  Graphics;

{$R *.res}

function DrawFormat(filename: pchar): TBitmap; stdcall;
begin
Result := TBitmap.Create;
Result.LoadFromFile(filename);
end;

exports
  DrawFormat name 'DrawFormat';

begin
end.

Procedura ta otwiera plik bmp i podaje go jako bitmape w funkcji. To taki plugin do przeglądarki graficznej. I teraz mam problem bo w kodzie programu mam taki kod:

if FileExists(ExtractFilePath(Application.ExeName)+'formats\' +ansilowercase(StringReplace(ExtractFileExt(nazwa), '.', '', [rfReplaceAll])) +'.dll') then
   begin
     DLL := LoadLibrary(PChar(ExtractFilePath(Application.ExeName)+'formats\' +ansilowercase(StringReplace(ExtractFileExt(nazwa), '.', '', [rfReplaceAll])) +'.dll'));
     try
       @DrawFormat := GetProcAddress(DLL, 'DrawFormat');
       try
       BMP.Assign(DrawFormat(pchar(nazwa)));
       except on Exception do BMP.LoadFromFile(ExtractFilePath(Application.ExeName) +'gfx\\broken-image.bmp');
       end;
     finally
     FreeLibrary(DLL);
     end;
   end;

i w miejscu assignowania bitmapy w trakcie działania programu wywala błąd: EConvertError!! Pomocy co jest źle!!??

0

Może zamiast funkcji spróbować na wskaźnikach??

0

No i ku... dupa :[

0

Wydaje mi się, że za wcześnie zwalniasz tą biblioteczkę. Ja bym tą bitmapę podpiął pod jakąś zmienną w programie głównym przez zwykłe podstawienie, a nie assign. Bo tak to zdaje się, że masz tylko pointer do tamtej bitmapki i jak ją zwalniasz, to się chrzahni. Może się mylę, ale spróbuj.

0

@DrawFormat := GetProcAddress(DLL, 'DrawFormat');

A co to jest u ciebie DrawFormat? .. - pokaż deklarację tej zmiennej - ona musi mieć budową taką samą jak w bibliotece..

A w ogóle to nie twórz bitmapy w ten sposób, tylko przekazuj wskaźnik...

1 użytkowników online, w tym zalogowanych: 0, gości: 1