Fehler bei:Frames in CppWebBrowser auswählen (IHTMLWindow2 -> get_document)



  • Hi

    ich habe mir folgende Methoden zum arbeiten mit Frames in CppWebBrowser gebaut:

    bool OControl::ResetFrame()
    {
      if(SUCCEEDED(Browser->Document->QueryInterface(
        IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
      {
        OK = true;
      }
      else
      {
        OK = false;
      }
      return OK;
    }
    

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

    bool OControl::selectFrame(int frameIndex)
    {
      LONG ilFramesCount = 0;
      IHTMLFramesCollection2 *pFrames = NULL;
      if(SUCCEEDED(HTMLDocument->get_frames(&pFrames)))
      {
        // Anzahl der Frames bestimmen:
        pFrames->get_length(&ilFramesCount);
    
        if(ilFramesCount > frameIndex)
        {
          VARIANT vFrame;
          VARIANT ret;
          vFrame.vt = VT_UINT;
          vFrame.lVal = frameIndex;
    
          if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
          {
            // Zeiger auf IHTMLWindow2 des Frames besorgen:
            IHTMLWindow2 *pWindow = NULL;
            if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,
              (LPVOID*)&pWindow)))
            {
              // Zeiger auf IHTMLDocument2 des Frames besorgen:
    
              if(SUCCEEDED(pWindow->get_document(&HTMLDocument)))
              {
                OK = true;
    
              }
              else
              {
                OK = false;
              }
            }
            pWindow->Release();
    
          }
          pFrames->Release();
          return OK;
        }
        else
        {
          pFrames->Release();
          return false;
        }
      }
    }
    

    Hiermit wähle ich einen Frame aus.

    Nun mache ich folgendes:

    game->selectFrame(0);
      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 :

    game->ResetFrame();
      game->selectFrame(0);
      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:

    if(SUCCEEDED(pWindow->get_document(&HTMLDocument)))
              {
                OK = true;
    
              }
              else
              {
                OK = false;
              }
    

    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?



  • Kann man irgentwo eine Hilfe (ähnlich der des BCB) mit allen Methoden Eigenschaften etc bekommen?

    Gibt es eine Möglichkeit den FireFox auf ähnliche Weise einzubinden und es einmal mit ihm zu versuchen?



  • Nach langem gebastel und umstellen der Seite klappt es jetzt.

    Bestände interesse daran, dass ich mal eine klasse dazu bastel?

    Ansonsten poste ich die Tage den Code sobald er überarbeitet ist.


Log in to reply