2009-06-03 5 views
4

Wir haben eine COM-Komponente von Delphi 2007, die von einer ISAPI-Anwendung ausgeführt wird. Die COM-Komponente hängt die App, weil sie versucht, eine MessageBox() anzuzeigen. Der Aufruf von MessageBox() muss in der Delphi-RTL erfolgen, sofern er nicht in unserem Benutzercode enthalten ist.Verhindern, dass die Delphi-COM-Komponente MessageBox() anzeigt

Die App hängt natürlich, weil niemand am Server angemeldet ist, um die MessageBox() zu löschen.

Wie konfigurieren wir unser Delphi-Projekt so, dass Delphi RTL nicht versucht, MessageBox() bei Ausnahme anzuzeigen?

Antwort

-1

Ich habe eine Einheit erstellt, um MessageBox/MessageDlg Anrufe (über Umleitung) zu haken, so kann ich diese Anrufe in einem Windows-Dienst unterdrücken (um "hängen" meiner Dienstdll wegen etwas dummer Code von jemand anderem mit ein Message-Box-Aufruf drin). Wenn Sie es wollen, kann ich diese Einheit suchen und Ihnen senden.

+0

Ja, ich möchte den Code sehen. –

+0

Was ist Ihre E-Mail, damit ich es Ihnen senden kann? –

+0

kbyington bei netrate dot com danke Ist es legal, den Microsoft-Umleitungskram zu verwenden, ohne die $ 10.000 Lizenzgebühr zu zahlen? http://www.microsoft.com/iplicensing/productDetail.aspx?productTitle=Detours –

1

Ich kenne keinen direkten Weg in Delphi, aber was Sie tun können, ist ein kleines Skript in AutoIT/AutoHotKey schreiben und dieses Skript in der Taskleiste laufen zu lassen, so dass es automatisch die MessageBox schließt.

Glauben Sie mir, es ist sehr einfach.

http://www.autoitscript.com/autoit3/index.shtml

http://www.autohotkey.com/

HTH

+0

Das setzt voraus, dass die App einen Desktop hat. Dies ist möglicherweise nicht der Fall. –

+0

Ich liebe Autohotkey. –

+0

Ich glaube nicht, dass es eine nicht Desktop-Anwendung ist. Das Poster entwickelt derzeit in Delphi und Delphi generiert Desktop-Apps. –

2

Was sagt die messagebox? Ich nehme an, dass es eine Ausnahme ist. Warum legen Sie keinen Ausnahme-Handler um den Code in der COM-Komponente und protokollieren die Ausnahme auf andere Weise? (Z. B. Verwenden des Ereignisprotokolls). Und/oder beheben Sie das Problem, das zu der Ausnahme führt.

+0

Keine Ahnung was die Messagebox sagt. Es gibt keine Möglichkeit, es anzuzeigen, da sich niemand angemeldet hat. Ja, es ist ein Ausnahmebehandler, da dies die einzigen MessageBox() - Aufrufe in der RTL sind. –

+0

Mein erster Gedanke war mit Jim, stell sicher, dass du nicht derjenige bist, der eine Message Box zeigt.Als Nächstes müssen Sie sicherstellen, dass alle Ihre COM-Methoden mit "Safecall" gekennzeichnet sind. Auf diese Weise ** wird jede Ausnahme, die während der Methode ausgelöst wird, von einem try-catch abgefangen, der der Methode implizit hinzugefügt wird, und die Ausnahme wird als E_FAIL HRESULT zurückgegeben. –

+0

... weil eine Regel von COM ist, dass Ausnahmen nicht dargestellt werden können. Und wenn Sie Ihre Methoden als Saferecall markieren, erledigt der Compiler Ihre Arbeit für Sie und wickelt Ihren Code in einen try-except-Code ein und gibt die Exception im impliziten hresult-Rückgabewert zurück. –

3

Schreiben Sie Ihren eigenen Ausnahmebehandler und hängen Sie ihn an das Application.OnException-Ereignis an. Wenn ein OnException-Ereignishandler vorhanden ist, verwendet Application nicht die Standard-MessageBox-Routine. Die Signatur wird wie folgt definiert:

TExceptionEvent = procedure (Sender: TObject; E: Exception) of object; 

Wenn dies ein Server ist, werden Sie wahrscheinlich wollen die Ausnahmeinformationen in ein Protokoll schreiben, und möglicherweise einige Fehler an den Benutzer zurück.

+0

+1 Dies ist der beste Weg, um die Ausnahme zu behandeln. Stellen Sie sicher, dass der IIS-Prozess über die vollständigen Rechte für den Speicherort verfügt, an dem Sie sich anmelden, wenn Sie sich von einem Dienst anmelden. – skamradt

+1

Das ist alles gut und gut, aber wenn es eine COM-Komponente ist und es nicht die Forms-Einheit verwendet, haben Sie nicht einmal eine Anwendungsreferenz. Ich habe viele in Bearbeitung befindliche DLL-COM-Server, die in Delphi geschrieben sind und keinerlei UI anzeigen. – Jim

+0

Nun, das Grundprinzip ist immer noch das gleiche. Irgendwo in einer äußeren Schleife haben Sie einen Standardausnahmebehandler, der alles abfängt und ein Meldungsfeld anzeigt. Vielleicht ist es keine Anwendungsvariable. Vielleicht ist es nur ein einfacher Versuch, Block wie Konsolen-Anwendungen verwenden. Was auch immer es ist, Sie müssen es finden und seine Funktionalität ersetzen. –

0

Ist es möglich, die Anwendung als eine Konsolenanwendung zu kompilieren? Ich bin mir nicht sicher, ob Sie dies tun können und immer noch COM-Objekt enthalten, dies würde verhindern, dass Meldungsdialoge angezeigt werden, bin ich mir sicher.

Nur ein Gedanke.

+0

Laut der Hilfe hat {$ APPTYPE CONSOLE} in einer DLL keine Bedeutung. 'Die Anweisung $ APPTYPE ist nur in einem Programm sinnvoll. Es sollte nicht in einer Bibliothek, Einheit oder einem Paket verwendet werden. –

Verwandte Themen