Am 09.05.2012 15:47, schrieb Hermie:
> wenn mir VB6 jedes Mal in dieser Zeile abschmiert...
>
>
> Set Links = New_c.JSONDecodeToCollection( _
> CStr(ucWebKit1.Browser.WebKit.Evaluate("GetLinks();")))
>
> .... was würdest Du denn dann als Erstes machen?
Auf Bugsuche gehen... ;-)
Soeben hier gemacht - und das Resultat ist, dass die
WebKit.Evaluate-Funktion (zumindest im COM-Interface,
wo dann vom C++-Code die JS-StringKlassen-Inhalte zu BSTR
gewandelt werden) offenbar nur maximal 16384 Zeichen
zurückgeben kann.
Das liegt nicht am RC4 (hab gerade nochmal gecheckt),
sondern direkt in den WebKit-C++ Sourcen.
Bei Google.de (bei mir so um die 35 Links) die per
JSON.stringify zu serialisieren waren, klappt das noch gut -
bei
heise.de (405 zu serialisierende Link-Infos)
wird dann das zurückgegebene evaluierte String-Result
größer als 16kB - und dann gab es (auch beim mir) den crash.
Weiss nicht, ob die JS-Eval-Funktion nur zum Rausreichen
kleinerer Sachen gedacht war, jedenfalls klappt das
beim Wandeln von JS::string zu BSTR bei langen Strings
nicht wie es soll...
Ein Workaround, bei dem offenbar keine Probleme mit dem
Rausreichen langer Strings in die COM-Welt auftreten,
ist der Umweg über ein vom JS-Code geraistes Event...
Die finale Helfer-Funktion sieht bei mir also jetzt so aus:
Private Sub ParseLinks(Links As cCollection)
Dim i As Long, Count As Long
Dim Href As cCollection, Text As cCollection, Html As cCollection
If Not Links.Exists("count") Then Exit Sub
Count = Links("count")
Set Href = Links("href")
Set Text = Links("text")
Set Html = Links("html")
Debug.Print Count
' For i = 0 To Count - 1
' Debug.Print Href.ItemByIndex(i)
' Debug.Print Html.ItemByIndex(i)
' Debug.Print Text.ItemByIndex(i)
' Next i
End Sub
Und dann halt noch das Bestücken der entsprechenden Events,
einmal im LoadFinished...
Private Sub ucWebKit1_LoadFinished(...)
With New_c.StringBuilder
.Append "function GetLinks(){"
.Append " var Links = new Object();"
.Append " Links.text = new Array();"
.Append " Links.html = new Array();"
.Append " Links.href = new Array();"
.Append " Links.count = document.links.length;"
.Append " for (var i=0; i < document.links.length; i++){"
.Append " var li = document.links[i];"
.Append " Links.text[i] = li.innerText;"
.Append " Links.html[i] = li.innerHTML;"
.Append " Links.href[i] = li.href;"
.Append " }"
.Append " return Links;"
.Append "}"
.Append "RaiseVBEvent(GetLinks(),'ParseLinks');"
ucWebKit1.Browser.WebKit.AddScript .ToString
End With
End Sub
Und dann enstprechend im JSEventCallback-Event,
welches wie gesagt mit längeren Strings klarkommt.
Private Sub ucWebKit1_JSEventCallBack(...)
If EventName="ParseLinks" And Not JSONEventObj Is Nothing Then
ParseLinks JSONEventObj
End If
End Sub
Ansonsten vielleicht doch besser direkt mit dem DOM
arbeiten, wenn Dir JS (bzw. obiger Workaround) "zu heiß"
ist. Ulrich hat ja schon was dazu geschrieben (also
gar soviel wäre an meiner Basis-Routine eigentlich nicht
nachzurüsten).
Olaf