CString in einer Set Methode



  • Moin,

    erstmal ein frohes neues Jahr!

    ich habe in meiner CMainframe Klasse einen CString als private definiert.

    private:
    // Angemeldeter Benutzer
    CString m_Benutzer;

    und dazu eine entsprechende Set Funktion geschrieben, um den Wert aus einer anderen Klasse setzen zu können.

    void CMainFrame::SetUser(CString sUser)
    {
    m_Benutzer = sUser;
    }

    Die aufrufende Stelle sieht so aus :

    CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();

    pMain->SetUser(_T("Jahnke"));

    In der SetUser Funktion zu einem
    Ausnahmefehler bei 0x00A131C8 in Stundenver5.exe: 0xC000041D: Ausnahmefehler während eines Benutzerrückrufs

    in der Funktion :

    ATL_NOINLINE void Reallocate(In int nLength)

    in der Zeile :

    CStringData* pNewData = pStringMgr->Reallocate( pOldData, nLength, sizeof( XCHAR ) );

    Wenn ich das mit dem Debugger verfolge steht in der SetUser Funktion in der m_Benutzer Variablen Müll drin.

    Egal welche Methode ich aufrufe, z. B. m_Benutzer.Empty();```cpp

    immer kommt es zu diesem Ausnahmefehler.

    Definiere ich einen CString in der Set Funktion, läßt sich der Wert zuweisen, nur nicht zur Membervariablen der Klasse.

    Vielleicht hat jemand von Euch einen Hinweis, was da schief läuft oder wie ich das Problem umgehen kann.

    Mfg
    verwegener



  • @Verwegener sagte in CString in einer Set Methode:

    CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();

    Ist das auch das richtige Objekt und die richtige Instanz? Überprüf das im Debugger (vielleicht im Konstruktor einen Breakpoint setzen und dann die Zeiger vergleichen).



  • @Verwegener sagte in CString in einer Set Methode:

    pMain

    ist auch ungleich 0?



  • Ich komme mit dem Debugger ja in der richtigen Methode an.

    Daher beantworte ich beide Fragen mit ja.



  • @Verwegener sagte in CString in einer Set Methode:

    Ich komme mit dem Debugger ja in der richtigen Methode an.

    Daher beantworte ich beide Fragen mit ja.

    Das ist eine fehlerhafte Schlussfolgerung.



  • Du kommst IMMER in der richtigen Methode an, die ist ja statisch, außer die ist virtuell.

    Die Methode musst du dir aufgelöst so vorstellen:

    SetUser(CMainFrame* this, CString sUser);

    Und jetzt ist die Frage, ob das this auch richtig ist.



  • this zeigt auf

    •   CFrameWnd	{hWnd=0x000f0a58 {unused=??? }}	CFrameWnd
      

    die Adresse die für CFrameWnd angezeigt wird ist

    •   CFrameWnd	{hWnd=0x000f0a58 {unused=??? }}	CFrameWnd
      

    aber für m_Benutzer wird

    •   m_Benutzer	L"櫌栰拘矬濨ȅ謀菹ﱥ謀鰵剷萏공\x3캋ᗿᇠ矮힋줳훿飩έ찀쳌쳌쳌ヒ譕菬밽ŷ⡴譤᠍"	ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t>>>
      

    angezeigt.

    Ich such noch nach der richtigen Adresse, erkenne aber was du meinst.

    Meine Funktion, die dann die Set Funktion aufruft, steht in der App::InitInstance().

    Ist da vllt. das CFrameWnd noch nicht bekannt ??



  • Moin,

    Jupp, das wars. Konstruktionsfehler !!

    Danke fürs Mitdenken !!

    Mfg
    verwegener



  • Tipp: das ist recht offensichtlich, zumindest ein sehr typisches Problem. Wenn so einer Art Zuweisung schiefgeht, als erstes die Instanz anschauen, in der das Zielobjekt leben sollte.


  • Mod

    Für so etwas gibt es aus der MFC STATIC_DOWNCAST. Da hättest Du einen sauberen ASSERT bekommen.


Log in to reply