CppWebBrowser: OnFileDownload Event fehlerhaft!
-
Ich habe unter Borland C++Builder 6 ein Problem mit dem genannten Event. Mit dem folgenden Code sollte dem Internet Explorer verboten werden, selber den Download zu verarbeiten:
void __fastcall TBrowserForm::CppWebBrowser1FileDownload(TObject *Sender, VARIANT_BOOL *Cancel) { *Cancel = VARIANT_TRUE; }Leider klappt das nicht, ich bekomme statt dessen eine Exception "Fehler beim Schreiben an Speicheradresse 0000000" (sinngemäß). Das ist auch nicht weiter verwunderlich, da Cancel tatsächlich NULL ist. Die Frage ist nur: Warum ist das so? Dieser Mechanismus mit *Cancel wird in vielen Events des CppWebBrowser verwendet, und überall zeigt *Cancel auf eine gültige Adresse, nur bei diesem Event nicht.
Bei einem Blick in die MSDN ist mir aufgefallen, daß dort die Syntax des Events etwas anders definiert ist:void FileDownload( VARIANT_BOOL *&ActiveDocument, VARIANT_BOOL *&Cancel );Ich vermisse im Borland Funktionskopf ActiveDocument, die Pointer sind auch anders deklariert.

Das Problem tritt sowohl unter Windows XP mit IE 6.0 als auch W2K mit IE 5.5 SP1 auf. Hat jemand eine Idee, was da los ist und auch eine Lösung? Wir wäre auch irgend ein Workaround recht, hauptsache ich bekomme irgendwie mit, daß der Anwender auf einen Downloadlink geklickt hat und kann den Download dann selber verarbeiten.
-
als Tip, man sollte nie in eine Adresse schreiben, ohne dass auf einen Nullwert abgefragt wird.
if(*Cancel) *Cancel = VARIANT_TRUE;Es kann sein, dass diese Funktion öfters aufgerufen wird.
-
MichaelK schrieb:
als Tip, man sollte nie in eine Adresse schreiben, ohne dass auf einen Nullwert abgefragt wird.
if(*Cancel) *Cancel = VARIANT_TRUE;Es kann sein, dass diese Funktion öfters aufgerufen wird.
Hm, danke für die Hilfe, das hilft aber leider auch nicht. zwar bekomme ich keine Exception mehr, aber warum auch immer, *Cancel ist immer NULL, und das kann nicht richtig sein. Ich behelfe mir momentan so, daß ich in BeforeNavigate2 nachsehe, ob die zu ladende URL eine Datei mit einer bestimmten Endung ist und breche dann das Laden dort schon ab mit
if(*Cancel) *Cancel = VARIANT_TRUE;so daß ich selber den Link behandeln kann. Das funktioniert, aber gefällt mir nicht besonders, die Variante mir OnFileDownload würde mir besser gefallen. Da ja das Interface von CppWebBrowser nicht zu funktionieren scheint, wie kann ich diesen Event selber abfangen? Hat da jemand einen Tip, ein Howto oder sowas?
-
Nachdem ich mit lange mit dem Event OnFileDownload des Webbrowser Controls herumgeschlagen habe, habe ich nun endlich einen Artikel im Web gefunden (http://www.it-faq.pl/mskb/325/204.HTM), der meine Vermutung bestätigt: Es ist wirklich ein Bug in der Typelibrary, wodurch der Event nicht korrekt verarbeitet werden kann.
Zitat:
According to the documentation, the FileDownload event fires with a single parameter: the VARIANT_BOOL argument Cancel. However, this event fires with another BOOL argument in addition to the Cancel VARIANT_BOOL argument. This BOOL argument indicates whether an Active Document server is loading in memory. However, because the type library has only one parameter listed, any development tool that generates event handlers that are based on the type library cannot properly sink the event.Der Artikel liefert auch gleich eine Lösung mit, nur leider bezieht sich die auf C#. Nun bin ich nicht gerade ein Held in C#, daher meine Frage: Gibt es hier jemanden, der die Lösung nach Borland CBuilder portieren könnte/wollte? Ich denke, daß auch andere froh wären, wenn ein Bugfix für CBuilder existierte, denn bisher habe ich nur Hilferufe zu OnFileDownload bei meinen Webrecherchen gefunden.