Windows Fehlermeldungen unterdrücken.

Windows Fehlermeldungen unterdrücken.

am 14.09.2006 08:33:28 von Hannes

Hi

Ich habe ein script, welches ein Commandline Programm startet.
Wenn dort jetzt etwas fehl schlägt kommt z.b. das typische Popup:
"Speicherzugriffsverletzung..."
Kann man das irgendwie unterdrücken?
Oder gibts ne Möglichkeit das abzufangen und einen "Click-OK" event zu
senden?
Ich will verhindern, daß das script bei einem derartigen Fehler
einfach stehen bleibt und auf Eingabe des Users wartet.

Liebe Grüße
Hannes

Re: Windows Fehlermeldungen unterdrücken.

am 14.09.2006 21:25:49 von Peter Roth

Hannes wrote:
> Hi
>
> Ich habe ein script, welches ein Commandline Programm startet.
> Wenn dort jetzt etwas fehl schlägt kommt z.b. das typische Popup:
> "Speicherzugriffsverletzung..."
> Kann man das irgendwie unterdrücken?

Mit eval(...) kann das manchmal gehen...

> Oder gibts ne Möglichkeit das abzufangen und einen "Click-OK" event zu
> senden?

Win32::GuiTest::SendKeys(...), Win32::GuiTest::SendMessage(...)

> Ich will verhindern, daß das script bei einem derartigen Fehler
> einfach stehen bleibt und auf Eingabe des Users wartet.

Um auf so ein Fenster reagieren zu können, muss dein Skript parallel
zum gestarteten Programm weiterlaufen, also system('start notepad.exe')
oder das Programm vor dem Skript starten.

Auch andere Routinen aus dem Modul Win32::GuiTest sind da hilfreich:
Du könntest beispielsweise alle paar Sekunden mit FindWindowLike(...)
nachschauen, ob das gestartete Programm noch ein Fenster auf hat. Die
Dokumentation zum Modul ist allerdings recht dürftig, das Package
gibt's aber auch von ActiveState.

Grüße,
Peter

Re: Windows Fehlermeldungen unterdrücken.

am 14.09.2006 22:22:18 von Slaven Rezic

"Peter Roth" writes:

> Hannes wrote:
> > Hi
> >
> > Ich habe ein script, welches ein Commandline Programm startet.
> > Wenn dort jetzt etwas fehl schlägt kommt z.b. das typische Popup:
> > "Speicherzugriffsverletzung..."
> > Kann man das irgendwie unterdrücken?
>
> Mit eval(...) kann das manchmal gehen...

Nein. Einen Segmentation Fault kann man so nicht abfangen. Man könnte
(jedenfalls unter Unix) ein fork() machen und den problematischen Teil
in einem Subprozess laufen lassen. Unter Windows ist das
wahrscheinlich nicht so leicht möglich, da fork() nur einen im selben
Prozessraum laufenden Thread erzeugt.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de
BBBike - route planner for cyclists in Berlin
WWW version: http://www.bbbike.de
Perl/Tk version for Unix and Windows: http://bbbike.sourceforge.net

Re: Windows Fehlermeldungen unterdrücken.

am 15.09.2006 12:02:17 von hjp-usenet2

On 2006-09-14 20:22, Slaven Rezic wrote:
> "Peter Roth" writes:
>> Hannes wrote:
>> > Ich habe ein script, welches ein Commandline Programm startet.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> > Wenn dort jetzt etwas fehl schlägt kommt z.b. das typische Popup:
>> > "Speicherzugriffsverletzung..."
>> > Kann man das irgendwie unterdrücken?
>>
>> Mit eval(...) kann das manchmal gehen...
>
> Nein. Einen Segmentation Fault kann man so nicht abfangen. Man könnte
> (jedenfalls unter Unix) ein fork() machen und den problematischen Teil
> in einem Subprozess laufen lassen.

Wenn ich das richtig verstehe, dann wird die Speicherzugriffsverletzung
von besagtem Commandline-Programm verursacht, nicht vom Perl-Script.
Somit läuft das ohnehin schon in einem eigenen Prozess.

Ob und wie man unter Windows von Kindprozessen verursachte Exceptions
abfangen kann, weiß ich nicht. Ich nehme an, dass es geht, weil die
Funktionalität z.B. für Debugger notwendig ist, aber ob man einen
Debugger in Perl schreiben möchte, nur um dem User einmal "Ok" klickseln
zu ersparen, ist eine andere Frage.

hp


--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd

Re: Windows Fehlermeldungen unterdrücken.

am 15.09.2006 12:57:14 von Ingo Menger

Peter J. Holzer schrieb:

> Ob und wie man unter Windows von Kindprozessen verursachte Exceptions
> abfangen kann, weiß ich nicht. Ich nehme an, dass es geht, weil die
> Funktionalität z.B. für Debugger notwendig ist, aber ob man einen
> Debugger in Perl schreiben möchte, nur um dem User einmal "Ok" klickseln
> zu ersparen, ist eine andere Frage.

Ebent. Da wär es wahrscheinlich letztlich einfacher, daß
versch****ene Programm, das man da aufruft, zu korrigieren, oder ganz
darauf zu verzichten, fehlerhafte SW zu verwenden.

Re: Windows Fehlermeldungen unterdrücken.

am 15.09.2006 17:20:53 von Peter Roth

Hannes schrieb:

> Ich habe ein script, welches ein Commandline Programm startet.

...

> Ich will verhindern, daß das script bei einem derartigen Fehler
> einfach stehen bleibt und auf Eingabe des Users wartet.

Gehe ich recht in der Annahme, dass normalerweise das Commandline
Programm nur kurz läuft und dann gleich dein Skript fortfahren soll?

In diesem Fall kannst du das Programm mit system('start Programm.exe')
aufrufen, dann wartet das Skript nicht. Du musst halt dann irgendwann
die 'Leichen' einsammeln, also die Fehlermeldungen wegklicken.

Grüße,
Peter

Re: Windows Fehlermeldungen unterdrücken.

am 16.09.2006 10:01:46 von Wolf Behrenhoff

Peter Roth schrieb:
> Hannes schrieb:
>
>> Ich habe ein script, welches ein Commandline Programm startet.
>
> ...
>
>> Ich will verhindern, daß das script bei einem derartigen Fehler
>> einfach stehen bleibt und auf Eingabe des Users wartet.
>
> Gehe ich recht in der Annahme, dass normalerweise das Commandline
> Programm nur kurz läuft und dann gleich dein Skript fortfahren soll?
>
> In diesem Fall kannst du das Programm mit system('start Programm.exe')
> aufrufen, dann wartet das Skript nicht. Du musst halt dann irgendwann
> die 'Leichen' einsammeln, also die Fehlermeldungen wegklicken.

Naja, das kommt aber darauf an, wie viele externe Programme man aufruft.
Ich habe zum Beispiel mal 30 ps-Dateien mit ghostscript nach pdf
konvertiert - da wäre es keine gute Idee gewesen, 30x gs gleichzeitig
laufen zu lassen...

Außerdem kann es sein, dass das Script auf die Ausgabe des externen
Programmes angewiesen ist. Dann muss man so oder so warten.

Wolf