Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit LoadPackage (https://www.delphipraxis.net/45224-problem-mit-loadpackage.html)

MaBuSE 2. Mai 2005 13:35


Problem mit LoadPackage
 
Dieses Problem bezieht sich auf Delphi 7.


Hallo,

ich habe folgendes Problem:

Wenn Delphi gestartet wird und nicht alle eingebundenen Package vorhanden sind, gibts eine Fehlermeldung ('Package xyz.bpl konnte nicht geladen werden'). Wenn ich nun delphi32.exe beende (den Prozess kille), bleibt die Fehlermeldung auf dem Bildschirm stehen. Die Fehlermeldung gehört nicht delphi32.exe, sondern dem Prozess "csrss.exe". Bei einem neuen Delphi Start kommt es gar nicht erst zu einer Meldung, es wird erst gewartet, bis diese Meldung weg geklickt wurde.

Meine Frage ist nun: Wie bekomme ich diese Fehlermeldung weg, ohne den Task csrss.exe zu killen.

Damit es nicht so einfach ist, das Ganze läuft nicht im Benutzermodus, sondern als Dienst.
-> Es ist also kein Benutzer angemeldet der das Fenster sehen würde.

Zum Testen habe ich 2 kleine Package und ein Testprogramm geschrieben.
- Package2.bpl benötigt das Package1.bpl zum starten.
- Project1.exe läd mit LoadPackage('Package2.bpl') das Package -> Fehlermeldung
- Project1.exe kann nun mit Taskmanager beendet werden (Prozess beenden) -> Die FGehlermeldung bleibt stehen.

Anmerkung:
Was mich wundert ist, dass in der SysUtils.LoadPackage ein
Delphi-Quellcode:
...
    raise EPackageError.CreateResFmt(@sErrorLoadingPackage,
      [Name,
       {$IFDEF MSWINDOWS}SysErrorMessage(GetLastError){$ENDIF}
       {$IFDEF LINUX}DLErrorMsg{$ENDIF}]);
...
aufgerufen wird. Dieses raise erzeugt das Fenster, das nicht mehr Delphi gehört. Ein
Delphi-Quellcode:
raise Exception.Create('Test');
bringt eine Fehlermeldung, die aber mit dem Killen des Project1.exe Prozeses weg ist. :gruebel:

Für Eure Hilfe bedanke ich mich schon mal im Voraus ;)

MaBuSE 2. Mai 2005 13:44

Re: Problem mit LoadPackage
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von MaBuSE
Zum Testen habe ich 2 kleine Package und ein Testprogramm geschrieben.

Die ich natürlich prompt vergessen habe anzuhängen ;)

NicoDE 2. Mai 2005 13:51

Re: Problem mit LoadPackage
 
Zitat:

Zitat von MaBuSE
Die Fehlermeldung gehört nicht delphi32.exe, sondern dem Prozess "csrss.exe". Bei einem neuen Delphi Start kommt es gar nicht erst zu einer Meldung, es wird erst gewartet, bis diese Meldung weg geklickt wurde.

Das passiert unter Windows NT, wenn bei einer MessageBox MB_SERVICE_NOTIFICATION angeben wird (könnte man bei einem interaktiven Programm als Programmierfehler bezeichnen).

Zitat:

Zitat von MaBuSE
Wie bekomme ich diese Fehlermeldung weg, ohne den Task csrss.exe zu killen.

Ziemlich eklig:
- ProzessId des CSRSS besorgen (ToolHelp32)
- Fenster global durchgehen (gute Filterkreterien)
- blödes Ding per Fensternachricht verschwinden lassen...

Der CSRSS hat eine Queue solcher Nachrichten (kennt man vom 'Nachrichtendienst', die kommen jeweils erst nach dem Wegklicken).

MaBuSE 2. Mai 2005 14:24

Re: Problem mit LoadPackage
 
Ich habe noch etwas interesanntes herausgefunden:

Im Taskmanager -> Prozesse -> Prozess beenden -> Fehlerdialog bleibt da (gehört csrss.exe)
aber
im Taskmanager -> Anwendungen -> Task beenden -> Fehlerdialog ist weg.

Wo liegt da der Unterschied, wie kann ich das aus Delphi (oder Perl) machen?

NicoDE 2. Mai 2005 14:35

Re: Problem mit LoadPackage
 
Zitat:

Zitat von MaBuSE
Im Taskmanager -> Prozesse -> Prozess beenden -> Fehlerdialog bleibt da (gehört csrss.exe)
aber
im Taskmanager -> Anwendungen -> Task beenden -> Fehlerdialog ist weg.

Wo liegt da der Unterschied, wie kann ich das aus Delphi (oder Perl) machen?

Das wissen nur die Lizenznehmer des Windows-Quellcodes :]

Wild guess: TerminateProcess versus WM_CLOSE (CSRSS bekommt wahrscheinlich nur beim 'sauberen' beenden das Ereignis mit).

MaBuSE 2. Mai 2005 15:21

Re: Problem mit LoadPackage
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von MaBuSE
Wie bekomme ich diese Fehlermeldung weg, ohne den Task csrss.exe zu killen.

Ziemlich eklig:
- ProzessId des CSRSS besorgen (ToolHelp32)
- Fenster global durchgehen (gute Filterkreterien)
- blödes Ding per Fensternachricht verschwinden lassen...
Der CSRSS hat eine Queue solcher Nachrichten (kennt man vom 'Nachrichtendienst', die kommen jeweils erst nach dem Wegklicken).

Delphi scheint nicht mit dieser Queue zu arbeiten Delphi wartet, bis die nachicht weggeklickt wird und wird erst danach wieder aktiv.

Es gibt eine relativ einfache Lösung, da der Fenstertitel bekannt ist:
(hier gefunden: http://www.delphipraxis.net/internal...=357046#357046 )

Delphi-Quellcode:
// schließt alle Fenster mit dem Titel 'delphi...'

procedure TForm1.Button2Click(Sender: TObject);
var
  aHandle: HWnd;
begin
  aHandle := FindWindow(nil, 'delphi32.exe - Komponente nicht gefunden');
  while aHandle <> 0 do
  begin
    SendMessage(aHandle, WM_CLOSE, 0, 0);
    aHandle := FindWindow(nil, 'delphi32.exe - Komponente nicht gefunden');
  end;
end;

// bzw: wenn nur ein Fenster geschlossen werden soll

procedure TForm1.Button2Click(Sender: TObject);
var
  aHandle: HWnd;
begin
  aHandle := FindWindow(nil, 'delphi32.exe - Komponente nicht gefunden');
  if aHandle <> 0 do
  begin
    SendMessage(aHandle, WM_CLOSE, 0, 0);
  end;
end;

//Beide Funktionen sind in der user32.dll enthalten:

function FindWindow; external user32 name 'FindWindowA';
function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;

function SendMessage; external user32 name 'SendMessageA';
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

function PostMessage; external user32 name 'PostMessageA';
function PostMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
@NicoDE: Danke für den Schupps in die richtige Richtung ;)

NicoDE 2. Mai 2005 15:27

Re: Problem mit LoadPackage
 
Zitat:

Zitat von MaBuSE
Es gibt eine relativ einfache Lösung, da der Fenstertitel bekannt ist:

Hoffe Du löscht nicht mal aus Versehen die delphi\bin\*.de ;)
Viel Spass mit Delphi-Hacking :)

MaBuSE 2. Mai 2005 16:29

Re: Problem mit LoadPackage
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von MaBuSE
Es gibt eine relativ einfache Lösung, da der Fenstertitel bekannt ist:

Hoffe Du löscht nicht mal aus Versehen die delphi\bin\*.de ;)
Viel Spass mit Delphi-Hacking :)

Darauf sind wir schon reingefallen, auf unserem Build Server ist ein englisches Delphi installiert :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz