error code 1400 dll

0

Witam

Mam dll napisana w delphi + Gui w innym napisane w innym jezyku . Wszytsko dziala funkcje i ogolnie komunikacja działa prawidłowo . Natomiast problem pojawia sie gdu Gui sie zamyka i probuje zamknac dllke otrzymuje soczysty komunikatch System Error. Code: 1400. Invalid window handle . Teraz przyblize troche sprawy w dll jest tworzony watek w ktorym tworze dwie formy na ktorych sa rozne komponenty vcl :

 
FreeOnTerminate := true;
Application.Initialize;
 Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;

przed wyjsciem gui jest odpalana funkcja exit no i tutaj juz kombinowalem ze wszykim form1.close ; lub application.terminate; nawet
while Application.ComponentCount > 0 do Application.Components[0].Free; i nic . Nadal error 1400 ktos ma pomysl jak wszytko wychwycic i pozamykac ?

pozdr.

0

FreeOnTerminate:=true powoduje, że okna są zamykanie samoczynnie. pewnie w trakcie twojej funkcji exit okno już nie istnieje, a ty uparcie robisz jakieś form1.close.

0

Okna istnieja bez wiekszego problemu , gui przez caly czas znimi wspolpracuje :) a przy form1.close idzie normalnie bez bledowo , zreszta identyczne zachowanie jest na freeonterminate:=false; . Sadze ze po prostu gubione sa uchwyty w momencie gdy watek tworzy te okna ? jak je uzyskac i pozamykac ?

pozdr.

0
anonim napisał(a)

[...] w dll jest tworzony watek w ktorym tworze dwie formy na ktorych sa rozne komponenty vcl : [...]

cos wiecej na ten temat? wiecej kodu!
obstawiam ze gdzies w wątku probujesz zmieniac vcl bez uzywania synchronizacji.

0

funkcja start w dll wyglada tak :

 
 watek1:= watek.Create(False);

w watku mam tworzenie okna

FreeOnTerminate := true;
Application.Initialize;
 Application.CreateForm(TForm1, Form1);
  Application.Run;
 

reszta polega na tym ze jak tworzy sie forma to oczywiscie tworza sie komponenty vcl ktore sa na niej osadzone. Gdy Gui pracuje i dll tez wszytko jest OK gdy konczymy prace z gui to przed odmontowaniem dll ze strony Gui rzucana jest funkca exit do dll gdzie mam np.:

 
form1.close;
application.terminate;

Debugger przelatuje przez caly kod ok i dop potem jest nieprawidlowe dojscie okna wyrzucone . To wyskakuje tylko i wylacznie przy probie wylaczenia gui . Gui jest w javie napisane . Moze jak tworzy sie forma to gdzies jest gubiony jej uchwyt ? przez to ze forma tworzona jest w nowym watku ? jak nie tworze formy all jest ok .

pozdr

0

przepraszam za post pod postem ale nie moge edytowac :) co Ciekawe po application.run w watku program Od razu tworzy okna i nie wykonuje nic pod ta linijka , dopiero teraz jak testowalem zachowanie to zauwazylem .

0

co Ciekawe po application.run w watku program Od razu tworzy okna i nie wykonuje nic pod ta linijka , dopiero teraz jak testowalem zachowanie to zauwazylem .

Ja nie wiem czy ty wiesz, ale ja wiem że to jest normalne zachowanie. Widać masz małą widzę o Delphi.

0

To ze nie wiem wszytkiego nie oznacza ze nie wiem nic ;) jakbym wszystko wiedzial to bym tu nie postowal . Ty masz tak ogromna ze wniosles Tyle do tematu ze nie wiem czy Ci sie kiedys odwdziecze mistrzu naucz mnie pisania tak wartosciowych wypowiedzi co Ty <3 . Moge dodac ze blad leci ewidentnie po evencie destrukcji formy .

0

To ze nie wiem wszytkiego nie oznacza ze nie wiem nic jakbym wszystko wiedzial to bym tu nie postowal . Ty masz tak ogromna ze wniosles Tyle do tematu ze nie wiem czy Ci sie kiedys odwdziecze mistrzu naucz mnie pisania tak wartosciowych wypowiedzi co Ty <3

Takie wypowiedzi to do swoich kolegów :* Bo ja nie jestem żadnym twoim kolegą.

. Moge dodac ze blad leci ewidentnie po evencie destrukcji formy .

To znaczy że coś zepsułeś przy jej tworzeniu/używaniu.
Mógłbyś pokazać więcej kodu ale widać według ciebie mamy wróżyć z fusów.
Więc wróżę: bład jest pod linią 5302.

0

Application.Run trwa przez cały czas działania programu. Wychodzi z niej dopiero po zamknięciu okna, albo po Application.Terminate. Dopiero wtedy wykona się kod poniżej Application.Run (i zazwyczaj na tym program się kończy, choć teoretycznie wcale nie musi).

1
anonim napisał(a)

To ze nie wiem wszytkiego nie oznacza ze nie wiem nic ;) jakbym wszystko wiedzial to bym tu nie postowal . Ty masz tak ogromna ze wniosles Tyle do tematu ze nie wiem czy Ci sie kiedys odwdziecze mistrzu naucz mnie pisania tak wartosciowych wypowiedzi co Ty <3 . Moge dodac ze blad leci ewidentnie po evencie destrukcji formy .

raczej mało wiesz. To, że w execute wątku zrobisz form := TForm.Create() wcale nie oznacza, że okno będzie działało w innym wątku niż główny! Tak się nie robi. Jak chcesz mieć okno niezależne od okna głównego to musisz je stworzyć w wątku ale nie metodami delphi tylko WinAPI. Dalej po co i dlaczego to Application.Initialize;' i to 'Application.Run; znalazło się w DLL??? Masz bardzo małe pojęcie o używaniu dll do przechowywania okienek i obawiam się, że cobyś nie zrobił będzie to tylko łatanie dziur i koniec końców program będzie wyglądał tak jak drogi w pl - dziur w załatanej dziurze załatana ponownie i tak jeszcze parę razy.

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