nicht unterstützte operation



  • hallo

    habe ein problem bei einer sdi-app mit formviews:
    in der methode OnInitialUpdate() bekomme ich einen fehler beim instanzieren

    void MyForm::OnInitialUpdate()
    {
      CFormView::OnInitialUpdate();
    }
    

    beim aufruf von CFormView::OnInitialUpdate() erscheint eine MessageBox mit folgendem Fehler:

    Es wurde versucht, eine nicht unterstützte Operation auszuführen.

    kann mir jemand helfen?

    mfg
    theWeasle



  • Setze einen Haltepunkt in die Funktion MyForm::DoDataExchange(CDataExchange * pDX)

    Manchmal liegt es an den Resourcen oder ähnlichem. Wenn Du ohne Fehler durch die o.g. Funkion durch kommst debugge einfach in CFormView::OnInitialUpdate(); rein und schau wo es scherbelt.

    Ansonsten gilt:http://www.lugbz.org/documents/smart-questions_de.html



  • Setze einen Haltepunkt in die Funktion MyForm::DoDataExchange(CDataExchange * pDX)

    Manchmal liegt es an den Resourcen oder ähnlichem. Wenn Du ohne Fehler durch die o.g. Funkion durch kommst debugge einfach in CFormView::OnInitialUpdate(); rein und schau wo es scherbelt.



  • Such mal in dem MFC-Verzeichnis deiner VC Installation nach dem Text "CNotSupportedException::CNotSupportedException" und setze einen Breakpoint in den Konstruktor der Klasse. Dann sollte der Debugger unterbrechen, bevor die Exception geworfen wird.



  • sollte vieleicht noch erwähnen, dass diese formview in einer dll ist, die aus meinem progi aufgerufen wird... ist die formview nicht in der dll erscheint dieser fehler auch nicht!?!?
    wie kann ich eine dll debugen?



  • Genauso wie eine Exe. 🙂

    Projekt laden - Debugger starten - exe wählen - schon ist alles wie gewohnt.



  • estartu_de schrieb:

    Genauso wie eine Exe. 🙂

    Projekt laden - Debugger starten - exe wählen - schon ist alles wie gewohnt.

    na ja...das geht irgendwie nicht so ganz, die exe findet dann die dll nicht!?



  • theWeasle schrieb:

    estartu_de schrieb:

    Genauso wie eine Exe. 🙂

    Projekt laden - Debugger starten - exe wählen - schon ist alles wie gewohnt.

    na ja...das geht irgendwie nicht so ganz, die exe findet dann die dll nicht!?

    oke...debuggen geht jetzt... 🙂



  • hmmm...habe alles "gedebuggt", hatte einen fehler in meiner ReplaceView-Methode. habe sie ersetzt. jetzt läuft alles ohne irgendeine fehlermeldung.

    jedoch wird meine neue form beim wechsel nicht angezeigt...
    Code ist von www.codeproject.com:

    BOOL CWkHostDoc::SwitchToView(CRuntimeClass * pNewViewClass)
    {
       CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
       CView* pOldActiveView = pMainWnd->GetActiveView();
    
       if (pOldActiveView->IsKindOf(pNewViewClass))
          return TRUE;
    
       ::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, 0);
    
       CCreateContext context;
       context.m_pNewViewClass = pNewViewClass;
       context.m_pCurrentDoc = this;
       CView* pNewView = STATIC_DOWNCAST(CView, pMainWnd->CreateView(&context));
       if (pNewView != NULL)
       {
          pNewView->ShowWindow(SW_SHOW);
          pNewView->OnInitialUpdate();
          pMainWnd->SetActiveView(pNewView);
          pMainWnd->RecalcLayout();
    
          pOldActiveView->DestroyWindow();
          return TRUE;
       }
    
       return FALSE;
    }
    

    hatt jemand ne idee?

    danke schön



  • Cool, das sieht aus, wie das Problem, mit dem ich mich noch in den Grundzügen rumkämpfe.

    Zwischen Formviews umschalten? Richtig erkannt??

    Dann sollte ich also als nächstes mal Codeproject erneut durchforsten.

    Viel Erfolg noch



  • estartu_de schrieb:

    Cool, das sieht aus, wie das Problem, mit dem ich mich noch in den Grundzügen rumkämpfe.

    Zwischen Formviews umschalten? Richtig erkannt??

    Dann sollte ich also als nächstes mal Codeproject erneut durchforsten.

    Viel Erfolg noch

    richtig erkannt!

    ich denke mit dem code (siehe oben) schaltet er um, zeigt die neue form jedoch nicht an.
    versuche mal weiter 😕



  • Den Code benutze ich auch, nur in der MDI Version.
    Damit es funktionierte habe ich aber einige Zeilen rumgedreht:

    pChild->RecalcLayout();
      pNewView->UpdateWindow();
      pChild->SetActiveView(pNewView);
      pNewView->OnInitialUpdate();    // nach hinten verschoben
    
      return TRUE;
    

    Dann funktionierte es.



  • habe jetzt rausgefunden, dass nicht der code schuld ist, dass die form nicht wechselt, sondern dass es an der dll liegt.

    ohne dll läuft es und sobald ich die formview aus der dll lade, wird diese nicht angezeigt 😕



  • Komisch, das kriege ich hin.

    Behaken sich da deine Resourcen? 😕

    Also bei mir liegen die Resource und die dazu gehörende Klasse in der selben dll. Und das funktioniert bombig. Auch mit zwei Views (oder mehr).

    Was für einen Projekttyp hast du eigentlich? Die Lösungen für MDI und SDI, die ich kenne, sind doch sehr unterschiedlich.



  • sdi app "host":
    - doc/view support
    - kein db support
    - kein compound document support
    - activeX controls support
    - baseclass ist "CFormView"

    und dann die dll:
    - MFC Extendsion DLL (using shared MFC DLL)

    in dieser dll habe ich die resourcen und klassen für meine FormView.

    aus der sdi-app rufe ich die methode Init der dll auf um die RUNTIME_CLASS zu erhalten

    extern "C" AFX_EXT_API int Init(CRuntimeClass** view)
    {
        new CDynLinkLibrary(Dll_frm_wineDLL);	
        *view = RUNTIME_CLASS(MyWineForm);
        return 1;
    }
    

    scheint so als findet die sdi-app die resourcen der dll nicht.
    denn die buttons etc. werden wie schon erwähnt nicht angezeigt. 😕



  • nach unzähligem try and error habe ich es nun geschafft... 🙂

    das problem waren die resourcen der dll, die nicht geladen wurden bzw. nicht verfügbar waren.

    jetzt lade ich sie nach dem dll aufruf:

    // DLL-Laden...
    
    // Altes Resourcen-Handle speichern
    HINSTANCE oldHandle = AfxGetResourceHandle();
    
    // Neues Resourcen-Handle setzen (die DLL)
    AfxSetResourceHandle(GetModuleHandle("my_dll.dll"));
    
    // DLL-Methoden aufrufen,
    // FormView laden,
    // FormView umschalten
    
    // Resourcen-Handle zurücksetzen
    AfxSetResourceHandle(oldHandle);
    

    so funktioniert es bis jetzt 🙂

    besten dank


Anmelden zum Antworten