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 TOleContainer.Doverb(ovShow) verursacht Exception (https://www.delphipraxis.net/93038-tolecontainer-doverb-ovshow-verursacht-exception.html)

berens 30. Mai 2007 17:05


TOleContainer.Doverb(ovShow) verursacht Exception
 
Hallo!

Mal wieder Problem: Ich habe einen TOleContainer, der nach dem Laden, während des ovShow eine Exception verursacht (oder das "Client" Programm).

Generell geht es. Das Problem tritt auf, wenn ich gleich zu Programmstart nacheinander 3x das gleiche OleObjekt erstelle. Das ist der VLCPlayer über ActiveX aka VideoLAN.VLCPlugin.2 .

Manchmal hilft es, zwischen dem Erstellen 10 Sekunden zu warten. Wäre natürlich später Klasse, wenn mein Programm bei 6 Containern also mindestens eine komplette Minute zum Starten braucht. Das System klappt spätestens nicht mehr, wenn bei dem Kunden dann ein PC dabei ist, der mehr als 10 Sekunden braucht...

Ein möglicher Fehler wäre, dass das betroffene OleObjekt teilweise oder ganz ausserhalb des scrollbaren Bereichs liegt. Normalerweise sollte dann aber eine Meldung in der Form "Das Objekt kann den Fokus nicht erhalten, da es unsichtbar ist" oder soein blabla.

Sollte es einmal so sein, dass die Fehlermeldung
Zitat:

---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt E:\debug\Project1.exe trat ein Problem mit folgender Meldung auf: 'access violation at 0x77c17740: read of address 0x00000000'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------
in einer Endlos-Schleife angezeigt wird, müsste ja ansich die ShowMessage kommen. Tut Sie aber nicht.

Ich habe auch eine Application.OnException mit einfach nur "exit".

Delphi-Quellcode:
  try
    CreateObject('VideoLAN.VLCPlugin.2', False);

    DOV;
...
Delphi-Quellcode:
procedure TVLCPlayer.DoV;
begin
  try
    DoVerb(ovShow);
  except
    on e: exception do begin
      ShowMessage(e.Message);
    end;
  end;
end;
Beim Beenden des Programmes als fertige .exe, also ohne Delphi, kommt immer:
Zitat:

---------------------------
Just-In-Time-Debugger von Visual Studio
---------------------------
Unbehandelte Win32-Ausnahme in welcome.exe [3920]. Fehler beim Just-In-Time-Debuggen der Ausnahme: Für keinen installierten Debugger ist das Just-In-Time-Debuggen aktiviert. In Visual Studio kann das Just-In-Time über folgenden Menüpfad aktiviert werden: "Extras -> Optionen -> Debuggen -> Just-In-Time".

Weitere Informationen finden Sie unter "Just-In-Time-Debuggen, Fehler" im Index der Dokumentation.
---------------------------
OK
---------------------------
Ausserdem kommt beim Starten mit Delphi immer dieser Fehler:
Zitat:

---------------------------
bds.exe - bordbk105N.dll
---------------------------
Assertion failure: "index <= items.n()"
in ..\win32src\DBKIMPL.CPP at line 2671
Continue execution?

---------------------------
Ja Nein
---------------------------
Ein Klick auf "Nein" und das komplette Delphi+Quellcode is zu :(




Nun die eigentlichen Fragen:

* Gibt es einen Ersatz zu TOleContainer.DoVerb(ovshow)
* Kann man Delphi nicht einfach "STFU" sagen, so dass wirklich _alle_ Fehlermeldungen unterdrückt werden?
* Warum **** dauernd die IDE ab? ("Woher kommt der Fehler in Delphi mit der bordbk105N.dll?)
* Was ist aus der supertollen Trennung zwischen Host (mein Programm) und Client (ActiveX, hier VLC-Player) geworden?
* Warum bekomme ich die Exceptions von VLC ab?
* Warum ist es technisch Möglich, dass das ActiveX (als dessen .exe oder .dll) mit den Kommandozeilen-Parametern gestartet wird, mit denen mein Programm gestartet wurde?

Ohne Ironie:
Mein Programm läuft wirklich super, und ich habe kein einziges Problem mit irgendeinem Fehler. Alles was mir Probleme bereitet, sind solche **** Fehlermeldungen. Würde das Programm einfach weiterlaufen, wäre alles Klasse.


Für irgendwelche Tips und Ideen bin ich wie immer seeeeehr dankbar.

PS: Sorry für die schlechte Laune, aber wenn man 90% des Arbeitstages mit dem wegklicken von Fehlermeldungen verbringt statt zu Programmieren, macht das Ganze irgendwann keinen Spaß mehr.

Mfg Mathias

shmia 30. Mai 2007 18:22

Re: TOleContainer.Doverb(ovShow) verursacht Exception
 
Häufig werden OLE-Objekte nicht korrekt programmiert, da es nicht ganz einfach ist.
Ich würde zunächst mal mehrere OLE-Objekte (VideoLAN.VLCPlugin) in WinWord einfügen und schauen was passiert.
Kannst du einen Fehler provozieren, dann eine Mail an den Hersteller und auf Updates hoffen.

Du hast den Just-In-Time Debugger von Visual Studio auf deinem Rechner aktiv.
Vorallem in Zuammenarbeit mit Delphi ist das sehr störend: erst wird ewig VS geladen, dann gibt eine Fehlermeldung ohne Ausagekraft und zum Schluss gibt's eh nix zu debuggen.
Versuch mal den JIT-Debugger zu deaktivieren.

Ich weiss auch nicht, welche Komponenten du in deiner Delphi IDE installiert hast. Fehlerhafte Komponenten können auf jeden Fall die ganze IDE zum Abstürzen bringen.

* Was ist aus der supertollen Trennung zwischen Host (mein Programm) und Client (ActiveX, hier VLC-Player) geworden?
* Warum bekomme ich die Exceptions von VLC ab?
Dein Programm ist der Client; der VLC-Player ist der Host.
Exceptions des Host-Objekts werden immer an den Client übergeben.

Die Idee, ALLE Exception in der Anwendung komplett zu unterdrücken führt zu nichts.
Besser man baut sein Haus (Programm) auf holzwurmfreien Balken.

berens 31. Mai 2007 00:55

Re: TOleContainer.Doverb(ovShow) verursacht Exception
 
Danke schonmal für die Antwort.

Leider habe ich keine Ahnung wie ich die Sachen in Word einfüge, denn in der Ole-Liste stehen nur vordefinierte Werte, und bei "Von Datei" wir irgendein anderes Programm gestartet.

Habe kein Visual Studio absichtlich installiert, wird wohl mit einem M$-SDK bei Delphi 2007 dabei gewesen sein. Ich finde keinen Punkt um JIT zu deaktivieren. Muss ich mal googlen. Falls irgendwer weiss wie...


Nichts desto trotz:
Was würde es mir bringen, die Exceptions des Ole-Containers zu bekommen, wenn ich nichts dagegen tun kann? Ich komme ja noch nicht einmal in den except-Teil von try ole.doverb(ovshow) except ... end. Und Application.OnException reagiert ja auch nicht gescheit auf diese AV.

Gibt es also, unabhängig davon wie sinnvoll, schwachsinnig ;) oder gefährlich dieses Verfahren ist, eine Möglichkeit, alle Fehlermeldungen zu unterdrücken oder in ein stilles Logbuch (z.B. meine eigene Routine die das in eine TXT Datei) speichert?

Mfg

shmia 31. Mai 2007 11:09

Re: TOleContainer.Doverb(ovShow) verursacht Exception
 
Exceptions, die in einem COM-Server entstehen werden automatisch von der VCL in eine Delphi-Exception umgewandelt (dabei sind die Interfaces IErrorInfo und ISupportErrorInfo im Spiel)
Wenn die Exception nicht durch einen Exception-Handler (try..except Block) abgefangen wird,
steigt sie wie eine Luftblase durch den Honig nach oben.
Application.OnException ist die letzte Gelegenheit die Exception doch noch zu packen und z.B. in eine Logdatei zu schreiben.
Falls Application.OnException nicht zugewiesen ist, wird die Exception über Application.ShowException(E) angezeigt.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := AppException;
end;
procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
  if E is EOleSysError then  // OLE-Exceptions
    Caption := E.Message     // nur als Caption anzeigen um störende Meldungen zu vermeiden
  else
    Application.ShowException(E); // alle anderen Exception wie gehabt anzeigen
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 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