Problem mit static_downcast



  • David_pb schrieb:

    Wann welcher Konstruktor aufgerufen wird ist vollkommen egal. Solang keine View aktiv gesetzt wurde, für deinen Frame, bekommst du von GetActiveDocument() immer NULL geliefert.

    Eben nicht. GetActiveDocument gibt ja was ungleich NULL zurück, das Problem besteht beim Ausführen von STATIC_DOWNCAST. Das ist das, was ich nicht verstehe.

    Martin Richter schrieb:

    Ein Frame braucht von einem Doc nichts zu wissen!
    Da ist der Bruch! Warum sollte das Frame überhaupt etwas mit dem Doc zu tun haben sollen?

    Ich erstelle eine Messsoftware. Der Wert zweier Messeingänge werden über einen Workerthread abgerufen und in einer Variablen im Doc gespeichert. Jetzt soll in der Statuszeile, die meines Wissens ja Bestandteil vom Mainframe ist, dieser Wert angezeigt werden. Dazu soll der Wert der Variablen aus dem Dco gelesen und dort reingeschrieben werden. Das Konstrukt gibts schon, da ja dort auch die Threadsynchronisation realisiert wird. Wenn der Thread mit Schreiben fertig ist bekommt das Mainframe eine Nachricht, damit es die Werte aktualisieren soll. Hast du einen Vorschlag wie ich es anders machen soll?



  • Was liefert denn GetActiveDocument()? Ggf kannst du ja mal die Runtimeclass bestimmen.



  • GetActiveDocument liefert mir eine Speicheradresse. Aber beim Aufruf von GetActiveDocument()->IsKindOf(RUNTIME_CLASS( CMyDoc )) kracht er auch an die Wand.


  • Mod

    Lass das Doc eine Nachricht an AfxGetMainWnd senden...
    Ich seheda kein Problem. Keine Klasse muss in diesem Fall was voneinander wissen...



  • Martin Richter schrieb:

    Lass das Doc eine Nachricht an AfxGetMainWnd senden...
    Ich seheda kein Problem. Keine Klasse muss in diesem Fall was voneinander wissen...

    Du meinst also mit Sendmessage/Postmessage das Mainframe informieren und als Parameter den Messwert übergeben?



  • Problemcaster schrieb:

    GetActiveDocument liefert mir eine Speicheradresse. Aber beim Aufruf von GetActiveDocument()->IsKindOf(RUNTIME_CLASS( CMyDoc )) kracht er auch an die Wand.

    Was meinst du mit "kracht an die Wand". Schlägt ne Assertion zu oder was? Gibts keine Detailiertere Fehlerbeschreibung?


  • Mod

    Problemcaster schrieb:

    Martin Richter schrieb:

    Lass das Doc eine Nachricht an AfxGetMainWnd senden...
    Ich seheda kein Problem. Keine Klasse muss in diesem Fall was voneinander wissen...

    Du meinst also mit Sendmessage/Postmessage das Mainframe informieren und als Parameter den Messwert übergeben?

    Ja! Es gibt auch Tausend andere Möglichkeiten:
    Dein Thread sendet dem Mainframe eine Nachricht und gibt einen Interface zeiger zurück mit dem Du die Statuszeile bearbeitest.

    Zumindest gibt es x-Möglichkeiten in dem nicht die eine Klasse alles von der anderen wissen muss und Abhängigkeiten geschafen werden, die nicht sein müssen...


  • Mod

    David_pb schrieb:

    Problemcaster schrieb:

    GetActiveDocument liefert mir eine Speicheradresse. Aber beim Aufruf von GetActiveDocument()->IsKindOf(RUNTIME_CLASS( CMyDoc )) kracht er auch an die Wand.

    Was meinst du mit "kracht an die Wand". Schlägt ne Assertion zu oder was? Gibts keine Detailiertere Fehlerbeschreibung?

    Wenn GetActiveDocument() NULL liefert, dann muss Dein Code auch zu einem Crash führen... und das ist hier das Problem. GetActiveDocument liefert NULL!



  • Martin Richter schrieb:

    David_pb schrieb:

    Problemcaster schrieb:

    GetActiveDocument liefert mir eine Speicheradresse. Aber beim Aufruf von GetActiveDocument()->IsKindOf(RUNTIME_CLASS( CMyDoc )) kracht er auch an die Wand.

    Was meinst du mit "kracht an die Wand". Schlägt ne Assertion zu oder was? Gibts keine Detailiertere Fehlerbeschreibung?

    Wenn GetActiveDocument() NULL liefert, dann muss Dein Code auch zu einem Crash führen... und das ist hier das Problem. GetActiveDocument liefert NULL!

    Das bestreitet Problemcaster ja permanent.



  • Martin Richter schrieb:

    Wenn GetActiveDocument() NULL liefert, dann muss Dein Code auch zu einem Crash führen... und das ist hier das Problem. GetActiveDocument liefert NULL!

    Ja eben nicht. GetActiveDocument liefert 0x00411479. Blöd ist, dass das eben nicht die gleiche Adresse ist die GetDocument im CView zurück gibt.

    David_pb schrieb:

    Was meinst du mit "kracht an die Wand". Schlägt ne Assertion zu oder was? Gibts keine Detailiertere Fehlerbeschreibung?

    Ja, es gibt einen Assert.



  • Was für eins? Die Dinger sind dazu da das man Informationen aus ihnen ziehen kann...



  • David_pb schrieb:

    Was für eins? Die Dinger sind dazu da das man Informationen aus ihnen ziehen kann...

    Das ist nicht das Problem. Ich möchte eigentlich eine Erklärung, warum STATIC_DOWNCAST einen NULL-Zeiger zurückgibt. Laut Beschreibung müsste in der Debug-Version ein ASSERT kommen, wenn er es nicht umwandeln kann.



  • Dann step eben mal durch, da wirst du sehen wo's hakt.


Anmelden zum Antworten