Problem z dll'em

0

Mam problem z dll'em. Oto jego kod:

library gif;

uses
  GifImage, Graphics;

{$R *.res}

type
  PBitmap = ^TImageBitmap;
  TImageBitmap = packed record
    Bitmap: TBitmap;
    Width, Height: integer;
  end;

procedure ConvertToBmp(filename: pchar; Bitmap: PBitmap); stdcall;
var
graphic: TGifImage;
begin
graphic := TGifImage.Create;
graphic.LoadFromFile(filename);

Bitmap^.Width := graphic.Width;
Bitmap^.Height := graphic.Height;
Bitmap^.Bitmap.Width := graphic.Width;
Bitmap^.Bitmap.Height := graphic.Height;
Bitmap^.Bitmap.Canvas.Draw(0,0,graphic);

graphic.Free;
end;

exports
  ConvertToBmp name 'ConvertToBmp';

begin
end.

Gdy wywołuje procedure z tego dll'a w formie programu to po 3 wywołaniach występuje AccessViolation :[ Dodam że dll'a ładuje dynamicznie przy onCreate formy (ale statycznie też nie działa)! Gdy samą procedure skopiuje do formy i wykonam to działa bez problemu. :/ Co jest nie tak, tylko co???

Pomocy!!!!! :[ :[

// Stosuj tag Delphi, nie Code - detox

0

Żeby było wszystko jasne oto kod formy:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, gifimage;

type
  PBitmap = ^TImageBitmap;
  TImageBitmap = packed record
    Bitmap: TBitmap;
    Width, Height: integer;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    BBB: TImageBitmap;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ Oto kod który jest w dll'u!!! Tutaj działa poprawnie!!!!!!!!
procedure aConvertToBmp(filename: pchar; Bitmap: PBitmap); stdcall;
var
graphic: TGifImage;
begin
graphic := TGifImage.Create;
graphic.LoadFromFile(filename);

Bitmap^.Width := graphic.Width;
Bitmap^.Height := graphic.Height;
Bitmap^.Bitmap.Width := graphic.Width;
Bitmap^.Bitmap.Height := graphic.Height;
Bitmap^.Bitmap.Canvas.Draw(0,0,graphic);

graphic.Free;
end;
}

procedure TForm1.Button1Click(Sender: TObject);
var
DLL: THandle;
ConvertToBmp: procedure(filename: pchar; BMP: PBitmap); stdcall;
begin
BBB.Bitmap := TBitmap.Create;
DLL := LoadLibrary('gif.dll');
try
@ConvertToBmp := GetProcAddress(DLL, 'ConvertToBmp');
ConvertToBmp('gif.gif', @BBB);
//aConvertToBmp('gif.gif', @BBB);
form1.Canvas.Draw(5,5, BBB.Bitmap);
finally
FreeLibrary(DLL);
BBB.Bitmap.Free;
end;
end;

end.

Ale teraz nie działa z dll'ka w ogóle!!!

0

Tak na oko (bez delphi) to spróbuj:

  • dodać pełne ścieżki do plików
  • nazwa jednego z parametru w deklaracji różni się od tego z biblioteki - nie jestem pewny czy to ma znaczenie - ale zmień żeby była jasność sytuacji..

Jak nie pójdzie to będziemy kombinować :)

0

Nic to nie zmienia, ale o dziwo jak usunąłem

BMP.Bitmap.Free

działa! Tylko teraz zajmuje to wszystko w ciul pamięci :/ a właśnie na tym mi głównie zależy :(

nie rozumiem dlaczego nie moge tego zwolnić?????? [???] [???] [???] [???] [???] [???]

0

Przecież Ci już powiedziałem... Zwalniając bibliotekę zwalniasz również tego bmp'ka, który jest do niego przywiązany. Spróbuj nie robić Bitmap.Create i Bitmap.Free.

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