AGB  ·  Datenschutz  ·  Impressum  







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

MessageBox ersetzen

Ein Thema von Codewalker · begonnen am 4. Jul 2006 · letzter Beitrag vom 4. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#1

MessageBox ersetzen

  Alt 4. Jul 2006, 07:44
Hallo zusammen.

Ich programmiere mir ein kleines Tool, welches einige Daten auf meinem Server sammelt (Speicherauslastung,An- und Abmeldeereignisse). Das Problem ist, dass bei einem Fehler eine MessageBox aufgeht und das Programm lahmlegt, weil niemand an dem Rechner ist und auf OK drücken könnte. Es gibt ja eine undokumentierte Funktion MessageBoxTimeOut, welche sich nach x Sekunden selbst schließt. Das geht auch ganz gut, nur rufen die Delphi-Bibliotheken selbst ja MessageBox und nicht MEssageBoxTimeOut auf. Kann man irgendwie alle Aufrufe von MessageBox nach MessageBoxTimeOut "umbiegen"
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#2

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 08:12
Bin mir nicht sicher, aber irgendwie könnte das gehen. ggf. mit Hooks. Da hab ich aber (noch) keine Ahnung von.

Ne andere (einfachere) Möglichkeit is es das MessageBox-Fenster einfach nach x-Sekunden abzuschießen. Such mal nach FindWindow(Ex)...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 08:33
Zitat von Codewalker:
Hallo zusammen.

Ich programmiere mir ein kleines Tool, welches einige Daten auf meinem Server sammelt (Speicherauslastung,An- und Abmeldeereignisse). Das Problem ist, dass bei einem Fehler eine MessageBox aufgeht und das Programm lahmlegt, weil niemand an dem Rechner ist und auf OK drücken könnte. Es gibt ja eine undokumentierte Funktion MessageBoxTimeOut, welche sich nach x Sekunden selbst schließt. Das geht auch ganz gut, nur rufen die Delphi-Bibliotheken selbst ja MessageBox und nicht MEssageBoxTimeOut auf. Kann man irgendwie alle Aufrufe von MessageBox nach MessageBoxTimeOut "umbiegen"
Halli Hallo,

vermeide einfach, daß Fehler auftauchen die eine Messagebox anzeigen könnten. Fange an kritischen Stellen Fehler mit try..execpt ab und reagiere entsprechend darauf (in ein Logbuch eintragen, Mail an den Admin schicken...).

Das ganze wird auf jeden Fall eine ganze Menge mehr Testaufwand bedeuten. Zu empfehlen wären da automatisierte Unittests mit DUnit oder anderen Testtools um die Serverapplikation auf mögliche Fehlerquellen abzuklopfen. Es ist auf jeden Fall nicht besonders elegant die Symptome (die Messageboxen) zu beseitigen die Krnkheit (die auftretenden Fehler) jedcoh im Programm zu lassen

Ciao,
Ralf
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 08:35
Diese undokumentierte Funktion ist mir unbeaknnt,. Ich habe aber mal eine Klasse geschriben TDemoProtect, die dies kann. Unit ist im Anhang. Wäre es aber nicht sinnvoller, statt Messageboxen anzuzeigen, eine Logdatei zu schreiben?
Angehängte Dateien
Dateityp: pas demoprotect_146.pas (3,0 KB, 22x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#5

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 08:52
Erst mal danke für die Antworten.

Zitat von Luckie:
Diese undokumentierte Funktion ist mir unbeaknnt,. Ich habe aber mal eine Klasse geschriben TDemoProtect, die dies kann. Unit ist im Anhang. Wäre es aber nicht sinnvoller, statt Messageboxen anzuzeigen, eine Logdatei zu schreiben?
Die Funktion ist hier http://bdn.borland.com/article/32736 erklärt. Ich will ja auch keine MessageBoxen anzeigen, nur werden manche halt "von alleine" (jaja, stark vereinfacht gesehen) aufgerufen, sei es von Windows oder von anderen Delphi Klassen und Units. Und ich kann halt nicht die halbe VCL umschreiben...

Zitat von Alfi001:
Es ist auf jeden Fall nicht besonders elegant die Symptome (die Messageboxen) zu beseitigen die Krnkheit (die auftretenden Fehler) jedoch im Programm zu lassen
Stimmt einerseits, aber das Programm muss halt unter allen Umständen weiterlaufen. Ich werde Fehler in einem Logbuch festhalten und vorher natürlich testen ohne Ende. Trotzdem kann man nicht alle Meldungen abfangen (z.B. Speichermangel - könnte ja fast immer passieren)


Zitat von r2c2:
Bin mir nicht sicher, aber irgendwie könnte das gehen. ggf. mit Hooks. Da hab ich aber (noch) keine Ahnung von.
Ich leider auch nicht - das geht damit aber bestimmt. Hat das schon mal jemand gemacht??
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 12:58
nach "etwas" rumprobieren hab ichs hinbekommen die MessageBox zu ersetzen.
Dazu hab ich folgende Funktion geschrieben (die Funktion "ersetzt" die ursprungsfunktion):
Delphi-Quellcode:
function ReplaceFunktion(AOldFunction, ANewFunction: Pointer): Boolean;
var lProcess,
    lWritten : Cardinal;
    lBuffer : Array[0..(1 + 4 + 1)-1] of Byte;
begin
  lProcess := OpenProcess(PROCESS_VM_WRITE or PROCESS_VM_OPERATION, True, GetCurrentProcessId);
  if (lProcess <> 0) then
  begin
    PByte(@lBuffer)^ := $68;
    PPointer(@lBuffer[1])^ := ANewFunction;
    PByte(@lBuffer[5])^ := $C3;
    if WriteProcessMemory(lProcess, AOldFunction, @lBuffer, SizeOf(lBuffer), lWritten) then
      result := lWritten = SizeOf(lBuffer)
    else
      result := False;
  end
  else
    result := False;
end;
Die Alte Funktion und die neue Funktion müssen zu 100 Identisch sein.
Für dein Beispiel würde der Aufruf wie folgt aussehen (MessageBoxB ist meine neue Funktion):
Delphi-Quellcode:
//Messagebox-Ausgaben in Applicationtitle ausgaben
function MessageBoxB(AHandle: HWND; AMsg, ATitle: PChar; uType: Cardinal): Integer; stdcall;
begin
  Application.Title := String(AMsg);
end;

[...]
begin
  ReplaceFunktion(@MessageBox, @MessageBoxB);
  //Und siehe da, der Fehler wird nicht mehr als herkömliche Messagebox angezeigt
  StrToInt('abc');
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 13:27
Zitat von Luckie:
Wäre es aber nicht sinnvoller, statt Messageboxen anzuzeigen, eine Logdatei zu schreiben?
Das würde ich auch sagen.
Meiner Meinung nach kann man JEDEN Fehler und JEDEN Hinweis der von irgendwem (Delphi, Windoes, Komponenten) angezeigt werden soll, abfangen und einen Eintrag in ein Logfile schreiben.

Ich finde es uncool, die roten Tupfer (MessageBoxen) zu überschminken, wenn ich Masern hab (ein Fehler vorkommt), nur um nicht zu zeigen, dass ich krank bin (nicht alle Fehler gesucht und gefunden habe).
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 13:39
in Bezug auf die Fehler wäre die Verwendung von Application.OnException sinnvoller.
Das ersetzen der MessageBox ist dann sinnvoll wenn diese nicht ins Design passt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#9

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 16:45
Das sieht ja super aus. Ich werd das heute abend direkt mal ausprobieren. Schon mal danke, ich werd Rückmeldung geben, wie es gelaufen ist
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#10

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 16:51
Zitat von SirThornberry:
Dazu hab ich folgende Funktion geschrieben (die Funktion "ersetzt" die ursprungsfunktion):

[...]

Die Alte Funktion und die neue Funktion müssen zu 100 Identisch sein.
Sag mal, kann deine ReplaceFunction alle Funktionen ersetzen?
Und was heißt dann zu 100% identisch? Du meinst in den Aufrufparametern und im Namen, oder?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:13 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