Problem mit Indy und HTTPS
-
Hallo,
ich hatte erst im falschen Bereich gefragt, deshalb hier nochmal:
Ich nutze noch den alten C++Builder 5, da dieser Indy10 nicht unterstützt und ich im Moment nicht auf einen anderen Compiler wechseln kann muss ich es irgendwie mit Indy9.X schaffen
Ich habe eine URL die mir eine .json datei zurück gibt, klar lesbar als normaler text. Testweise habe ich die URL auch mit dem TCppWebBrowser getestet, auch da kriege ich diesen Text aus der Json datei angezeigt.
Mein Problem ist, dass ich diesen Text irgendwie in einen AnsiString kriegen muss, da ich vom Programm aus weiter damit arbeiten muss, nur anzeigen reicht also nicht.
Zu dem Zwecke wurde ich schon auf die TIdHTTP komponente verwiesen, die funktion "get(URL);" funktioniert mit normalem HTTP auch wunderbar, kriegt aber HTTPS nicht auf die reihe. Laut Hilfestellung sollte sie dazu in der lage sein, beim versuch kriege ich aber nur die meldung "Could not load SSL Libary"
die wohl vom TIdSSLIOHandlerSocket kommt.Die ssleay32 und libeay32.dll liegen im programm verzeichnis, sind also definitiv aufzufinden.
Hat irgendjemand eine Idee was ich noch tun kann?
-
Kannst du soweit in den Indy Quelltext hineindebuggen, bis du siehst, wo die DLLs geladen werden? Ansonsten kannst du ja mal versuchen statisch zu linken, dann sollte deine Anwendung ohne DLL Abhängigkeiten lauffähig sein.
-
Die DLLs liegen direkt im programmordner, ich geh davon aus, dass er sie da auf jeden fall findet. er kriegt sie nur nicht auf.
wie ich inzwischen feststellen konnte kriegt Indy 10 das in diesem fall auch nicht auf die reihe.ich bin was die indy komponenten angeht ein totaler neuling, ich hab davon absolut keine ahnung. vllt nur eine einstellung in den SSLIOHandler Eigenschaften? sie stehen auf dem standard den mir der Compiler vorgibt
-
Konntest du bis in die LoadLibrary-Aufrufe debuggen? Selbst das klappt schon nicht?
-
wenn ich beim durch tracen via Breakpoint in die funktion "get(url)" rein gehe (bei mir F7), dann springt er auf die dstring.h, da drin auf __fastcall AnsiString(): Data(0) {}
wenn ich da jetzt weiter springe (bei mir F8) oder in die funktion rein zu gehen versuche (F7), krieg ich die fehlermeldung "HTTP/1.1 400 Bad Request".
ich weiß nicht ob dir das mehr sagt, ich hoffe es, mir jedenfalls nich wie gesagt, ich hab absolut keine erfahrung damit
so oder so, ich seh nirgendwo was von "LoadLibary". bis zur get funktion der komponente kommt er, weiter aber nich
-
Das war jetzt eine Vermutung von mir. Ich kenne mich mit den Indy Komponenten auch nicht aus. Eine DLL kann zu mindestens zwei Zeitpunkten geladen werden:
Direkt beim Programmstart und direkt vor der ersten Benutzung einer Funktion aus der DLL. Ich habe jetzt vermutet, dass bei dir die zweite Möglichkeit realisiert wurde und man da reindebuggen kann. Ist wohl leider doch nicht so.
Funktioniert das denn, wenn du statisch linkst?
-
Da ich den Kram vorne und hinten nicht auf die reihe kriege bin ich doch wieder auf den TCppWebBrowser umgestiegen, womit ich wieder vor meinem ursprünglichen Problem stehe:
hat irgendwer eine ahnung wie ich den Text (die angezeigte Json datei, was anderes steht auf der seite nicht), im zweifel auch als HTML text, aus dem Browser raus kriege, z.b. in einen AnsiString geschrieben?
Google suche hat mir da ein paar ergebnisse gegeben wie ich ihn über stream in eine datei gespeichert kriege, aber das will ich nicht. ich brauche den text um ihn weiter zu bearbeiten und ihn erst als datei zu speichern um ihn dann wieder auszulesen erscheint mir sehr unsauber
-
Hier nur festgehalten, falls nach mir noch jemand das Problem hat:
da ich mit Indy nicht weiter kam (blödes ssl) bin ich doch wieder auf den WebBrowser umgestiegen. Da ich den TWebBrowser (Browser.OleObject.Document. ...) nicht in c++ angesprochen kriege und der TCppWebBrowser sich strikt weigert diesen Code umzusetzen habe ich mir eine C++ taugliche lösung suchen müssen:
im "OnDocumentComplete" des TCppWebBrowsers:
AnsiString aTextContent= "";
Variant vDocument = Browser->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
Variant vBody = vDocument.OlePropertyGet("Body");
Variant vTextContent = vBody.OlePropertyGet("InnerText");
aTextContent = vTextContent;Steht jetzt der Text im AnsiSting aTextContent.