Dll a tworzenie formatki

0

Mam formatke tworzona z dlla:

procedure ShowHallEditor(ExD: String; PrD: String; HaD: String); stdcall;
begin
  HallEditor := THallEditor.Create(Self);

  HallEditor.EXED := ExD;
  HallEditor.PD := PrD;
  HallEditor.HD := HaD;

  HallEditor.Show;

  //HallEditor.Free;
end;

gdzie HallEditor jest nowa formatka jest jednak problem bo gdy metoda Create zostanie wywolana z parametrem Application to wywala blad odczytu pamieci 'acces volitation'. Jak zrobic aby wywolac metode Create z parametrem self ?? A moze problem nie tu lezy ??

Bardzo prosze o pomoc.

PS.Do uses mam dolaczone classes.

0

Self nie przejdzie, bo to nie metoda. Wywołaj z parametrem nil. Albo przekaż do DLLa wskaźnik do obiektu Application aplikacji, z której wywołujesz.

0

Dzieki za podpowiedz.

Zrobiłem tak jak mówiłeś przekazałem wskaźnik do Application głównego okienka jednak dalej błąd podczas ładowania dll'a:

Moj kod dla pliku dll:

procedure ShowHallEditor(ExD: String; PrD: String;var app: TApplication); stdcall;
begin
  HallEditor := THallEditor.Create(app);
  
  HallEditor.EXED := ExD;
  HallEditor.PD := PrD;

  HallEditor.ShowModal;


  HallEditor.Free;
end;

exports
  ShowHallEditor name 'ShowHallEd';

oraz główna aplikacja:

procedure ShowHallE(ED: String; PD: String; var app: TApplication); stdcall external 'ESali_DllLoader.dll' name 'ShowHallEd';

A blad "Acces Volitation at adres #jakis adres# in module Editor.dll Write of adress #jakis adres#.

Jak uruchamiam formatkę (która miała być wywoływana za pomocą dll'a) poprzez exe'ka to działa normalnie (bez błędów dostępu do pamięci).

Bardzo bym prosił o jakieś wskazówki jak usunąć błąd.

0

po pierwsze wcale nie trzeba przekazywać TApplication, bo dllka tworzy sama obiekt tego typu jeśli dodany jest do niej moduł Forms,
a pod drugie do dllki lepiej nie przekazyważ parametrów w postaci długiego stringa (lepiej użyć PChar)

0

ileż można pytać o to samo...

0

Problem nie leżał po stronie złego wywołania konstruktora. Teraz mam po prostu Create(Application); i działa. Problem stanowiło włączenie 'double buffer' w wywoływanej formatce (włączany był w konstruktorze) otóż miałem napisane HallEditor.DoubleBuffer := true; - nie wiem jak to zrobiłem ;-P ;-( (nie spanie od 3 dni daje o sobie znać)

Prosze o wykasowanie watku.

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