Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: So 28.06.09 11:52 
Hallo,
ich habe eine DLL, in der ich ein Formular verwende. Die DLL wird in einen Prozess injected.
Das Formular hab ich ganz einfach erstellt (Neu-Formular usw) ich kann es auch anzeigen. Wenn ich es aber im Hauptthread anzeige, ist das Formular gleich wieder weg (Bei formular.Show() )
Wenn ich es in einem anderen Thread ausführe und mit showmodal mache, bleibt es zwar da, aber ich kann es aus dem hauptthread nicht ändern. Der friert dann ein.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure ShowForm();
var wmsg   : tmsg;
begin
    frmConfig:=TfrmConfig.Create(nil);
    frmConfig.Show;
  while wMSG.message <> WM_USER+$FFFF do
    begin
      GetMessage(wMsg,0,0,0);
      TranslateMessage(wMsg);
      DispatchMessage(wMsg);
    end;
end;

//...
    ThreadForm:=BeginThread(nil,0,TFNThreadStartRoutine(@ShowForm),nil,0,TID);
//...
frmConfig.mLog.Lines.Add('Test');


Wie kann ich es sonst (einfach) lösen?


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am So 28.06.2009 um 13:06
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.06.09 12:19 
Die VCL ist nicht threadsicher. Dementsprechend muss normalerweise immer jede visuelle Komponente im Kontext des Hauptthreads erstellt und angesprochen werden.

Wie das bei einer in einen Non-VCL-Prozess injizierten DLL ist... keine Ahnung.
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: So 28.06.09 12:30 
hab mal als test noch ne thread gemacht :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TestForm();
begin
  Sleep(5000);
  showmessage('1');
  frmConfig.mLog.Lines.Add('Test');
  Sleep(1000);
  showmessage('1');
  frmConfig.mLog.Lines.Add('Test');
  Sleep(1000);
  showmessage('1');
  frmConfig.mLog.Lines.Add('Test');
  Sleep(1000);
  showmessage('1');
  frmConfig.mLog.Lines.Add('Test');
  frmConfig.mLog.Lines.Add('Test');
end;

was passiert:
die 1 kommt
"Test" erscheint im Memo
Alles gut so weit
JETZT: Ein fenster größer als der Bildschirm kommt
Programm crasht mit: "Leinwand/Bild erlaubt kein Zeichnen" und "Ungültiges FensterHandle"

Wie bekomme ich möglichst einfach ein Formular in eine DLL?
Soll ne Config werden, also müsste das Formular auch schön einfach zu erstellen sein. Wenn ich das alles NonVCL machen müsste brauch ich ja ewig bis das nach was aussieht.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.06.09 12:42 
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
Programm crasht mit: "Leinwand/Bild erlaubt kein Zeichnen" und "Ungültiges FensterHandle"
Das ist genau das Problem, wenn man VCL-Komponenten in Threads nutzt. Das geht eben nicht.

Du müsstest das irgendwie synchronisieren, aber wie das aus einer DLL heraus geht weiß ich nicht. Bisher hatte ich nie Bedarf dafür, weil ich das Konzept immer entsprechend entworfen habe. Warum muss das überhaupt in einen separaten Thread bei dir? :gruebel: Ich meine eine separate DLL, ok, klar, aber ein separater Thread mit Formular?
Espy1akop4
Hält's aus hier
Beiträge: 1



BeitragVerfasst: So 28.06.09 14:42 
Hey,
ich hab sowas schon in 2-3 Programmen benutzt(meistens auch ein Config dialog). Also bei mir hat es mit einer normalen VCL Form geklappt....

Threadfunktion:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function ShowGUI(pParam: Pointer): DWORD; stdcall;
begin
  Result :=0;
  Application.Initialize;
  Application.Title :='NosBot';
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end;


die Threadfunktion dann einfach aus z.B. DLLMain mit CreateThread oder BeginThread aufrufen und dann sollte alles ohne Probleme klappen ;). Und die kommunikation von Hauptthread mit dem Thread der Form könnte über SendMessage laufen und in der Form mit ApplicationEvent abgefangen werden.


Mit freundlichen Grüßen

Espy1akop4