AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit LoadPackage

Ein Thema von MaBuSE · begonnen am 2. Mai 2005 · letzter Beitrag vom 2. Mai 2005
Antwort Antwort
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Problem mit LoadPackage

  Alt 2. Mai 2005, 14:35
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 raise Exception.Create('Test'); bringt eine Fehlermeldung, die aber mit dem Killen des Project1.exe Prozeses weg ist.

Für Eure Hilfe bedanke ich mich schon mal im Voraus
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

Re: Problem mit LoadPackage

  Alt 2. Mai 2005, 14:44
Zitat von MaBuSE:
Zum Testen habe ich 2 kleine Package und ein Testprogramm geschrieben.
Die ich natürlich prompt vergessen habe anzuhängen
Angehängte Dateien
Dateityp: zip packageproblem_618.zip (219,3 KB, 7x aufgerufen)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Problem mit LoadPackage

  Alt 2. Mai 2005, 14:51
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 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).
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: Problem mit LoadPackage

  Alt 2. Mai 2005, 15:24
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?
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: Problem mit LoadPackage

  Alt 2. Mai 2005, 15:35
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).
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

Re: Problem mit LoadPackage

  Alt 2. Mai 2005, 16:21
Zitat von NicoDE:
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
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

Re: Problem mit LoadPackage

  Alt 2. Mai 2005, 16:27
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
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Problem mit LoadPackage

  Alt 2. Mai 2005, 17:29
Zitat von NicoDE:
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
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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