Fehler bei:Frames in CppWebBrowser auswählen (IE-Steuern)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Fehler bei:Frames in CppWebBrowser auswählen (IE-Steuern)

    Hi
    Ich arbeite mit dem Borland C++ Builder 6.
    Ich habe mir folgende Methoden zum arbeiten mit Frames in CppWebBrowser (VCL)gebaut:

    Quellcode

    1. bool OControl::ResetFrame()
    2. {
    3. if(SUCCEEDED(Browser->Document->QueryInterface(
    4. IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
    5. {
    6. OK = true;
    7. }
    8. else
    9. {
    10. OK = false;
    11. }
    12. return OK;
    13. }
    Alles anzeigen

    Diese Methode Soll die globale Variable HTMLDocument auf das Gundfesnter setzen.

    Quellcode

    1. bool OControl::selectFrame(int frameIndex)
    2. {
    3. LONG ilFramesCount = 0;
    4. IHTMLFramesCollection2 *pFrames = NULL;
    5. if(SUCCEEDED(HTMLDocument->get_frames(&pFrames)))
    6. {
    7. // Anzahl der Frames bestimmen:
    8. pFrames->get_length(&ilFramesCount);
    9. if(ilFramesCount > frameIndex)
    10. {
    11. VARIANT vFrame;
    12. VARIANT ret;
    13. vFrame.vt = VT_UINT;
    14. vFrame.lVal = frameIndex;
    15. if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
    16. {
    17. // Zeiger auf IHTMLWindow2 des Frames besorgen:
    18. IHTMLWindow2 *pWindow = NULL;
    19. if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,
    20. (LPVOID*)&pWindow)))
    21. {
    22. // Zeiger auf IHTMLDocument2 des Frames besorgen:
    23. if(SUCCEEDED(pWindow->get_document(&HTMLDocument)))
    24. {
    25. OK = true;
    26. }
    27. else
    28. {
    29. OK = false;
    30. }
    31. }
    32. pWindow->Release();
    33. }
    34. pFrames->Release();
    35. return OK;
    36. }
    37. else
    38. {
    39. pFrames->Release();
    40. return false;
    41. }
    42. }
    43. }
    Alles anzeigen


    Hiermit wähle ich einen Frame aus.

    Nun mache ich folgendes:

    Quellcode

    1. game->selectFrame(0);
    2. game->selectFrame(1);


    Mache noch ein paar sachen mit dem Formular im ausgewählten Frame und schicke es dann ab. Das Funktionert auch ohne irgendwelche Probleme!

    und danach :

    Quellcode

    1. game->ResetFrame();
    2. game->selectFrame(0);
    3. game->selectFrame(0);

    Das klappt aber leider nicht! Obwohl das ganze ja eigentlich genauso wie das erste klappen sollte! Wie weiter unten im Debugging beschrieben, ist auch ein Frame vorhanden. Es wird ja auch ein Frame gefunden dessen pWindow auch ermittelt werden kann. Nur das entsprechende Dokument kann nicht ermittelt werden! Aber warum nicht? das ist für mich absolut unverständlich!

    Meine Beobachtungen beim Debugging bis jetzt:
    #die globale HTMLDocument zeigt nach jedem aufruf von ResetFrame auf die selber Speicheradresse wie beim 1. Durchlauf ==> das Hauptfenster /Hauptframe hat immer die selbe Adresse ?!?
    #beim 1. durchlauf von selectFrame im 2 Codeabschnitt, bekommt pFrames eine speicheradresse, ilFramesCount bekommt den wert 1 (es sind also Frames vorhanden), pWindow wird auch eine Speicheradresse zugewiesen, aber dann passiet in diesem Codeabschnitt:

    Quellcode

    1. if(SUCCEEDED(pWindow->get_document(&HTMLDocument)))
    2. {
    3. OK = true;
    4. }
    5. else
    6. {
    7. OK = false;
    8. }
    dass, HTMLDocument auf NULL gesetzt wird und er in den else Zweig spring!

    Mache ich irgendwas falsch? oder lässt sich das irgentwie erklären?

    So wie ich das verstehe, sollte er doch hier HTMLDocument mit dem Zeiger auf das Dokument des ausgewählten Framebereichs (also den in pWindow) verweisen lassen. Warum schlägt dass den fehl?
    Beim erstemal klappt es ja, und ich kann die elemente im Frame bearbeiten!

    THX

    Dagsta

    Nachtrag:Kann es sein, dass es daher kommt, dass die erste seite über Navigate2 angesteuert wird und die 2. Seite, bei der es dann nicht mehr klappt über das Aufrufen des Formulars geöffnet wird? Wenn ja wie könnte man folgeseiten kontrolieren?