Access violation przy wyświetlaniu forma w bibliotece

0

Kod biblioteki:

library test;

uses
  Forms,
  Windows,
  SysUtils,
  Classes,
  dll in 'dll.pas' {frmDllForm};

{$R *.res}

procedure DllMain(Reason: Integer);
begin
case Reason of
      DLL_PROCESS_DETACH: MessageBox(0, 'Library unloaded...', 'Unloading DLL', MB_OK OR MB_ICONINFORMATION);
      DLL_THREAD_ATTACH: MessageBox(0, 'Thread created...', 'Thread Created', MB_OK OR MB_ICONINFORMATION);
      DLL_THREAD_DETACH: MessageBox(0, 'Thread destroyed...', 'Thread Destroyed', MB_OK OR MB_ICONINFORMATION);
      end;
end;

procedure ShowDLLForm(); stdcall;
begin
  frmDllForm := frmDllForm.Create(Application);
  frmDllForm.ShowModal;
  frmDllForm.Free;
end;

exports
ShowDLLForm name 'ShowForm';
begin
MessageBox(0, 'Library loaded...', 'Loading DLL', MB_OK OR MB_ICONINFORMATION);
DLLProc := @DllMain;
end.

Kod loadera:

implementation

{$R *.dfm}
procedure forma();
  stdcall; external 'test.dll' name 'ShowForm';

procedure TForm1.Button1Click(Sender: TObject);
begin
forma();
end;

end.

Po uruchomieniu wyświetla mi boxa z Library Loaded, przy zamykaniu Library Unloaded - biblioteka się ładuje, ale kiedy klikam na loaderze przycisk, dostaję wyjątek:
user image

Potrafi ktoś pomóc?

0

frmDllForm := frmDllForm.Create(Application) ? Takie coś nie ma prawa działać. Czy frmDllForm to nazwa zmiennej, odnoszącej się do okna, czy klasa tego okna?

0

Rozdział 10

Robiłem w/g tego... :/

0

Owszem. Ale tworzenie obiektu (instancji) wykonuje się zawsze w ten sposób:

Instancja:= TKlasa.Create;

U ciebie wygląda to tak:

Instancja:= Instancja.Create;

W tym kodzie obiekt Instancja nie istnieje jeszcze w pamięci (dopiero jest tworzony), więc nie można się odwołać do niczego, co jest z nią powiązane (w tym wypadku konstruktor).

0

Poprawiłem i WRESZCIE mi działa. Dzięki wielkie. :)

Ale inne pytanie mam - jak zrobić, by ta biblioteka działała 'sama z siebie', tj. żeby loader ją załadował i sam loader przestał działać, a reszta funkcji była wykonywana z biblioteki. Loader działałby w tle.

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