Solved

CString Access Violation mystery

Posted on 1998-05-06
15
958 Views
Last Modified: 2013-11-20
Help me figure out how to fix this!
I'm trying to pass a CString object from a message handler to another function that sets up a file name for opening.

My app has a runtime error at the point where the assignment is made.
When I debug, I go here:

in ...\mfc\include\afx.inl:
______________________________________
// CString
_AFX_INLINE CStringData* CString::GetData() const
      { ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
_AFX_INLINE void CString::Init()
_________________________________________

the call before that was from ...\mfc\src\strcore.cpp:
__________________________________________________
void CString::AllocBeforeWrite(int nLen)
{
if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength)
   {
      Release();
      AllocBuffer(nLen);
   }
   ASSERT(GetData()->nRefs <= 1);
}
____________________________________________
My code looks like this:
in the header:
_______________________________________
class CFe517App : public CWinApp
{
public:
      CFe517App();
      void SetTutName (LPCTSTR);
private:
      CString m_TutorName;
_____________________________________
in the cpp file:
__________________________________________________
void CFe517App::SetTutName ( LPCTSTR TName)
{      
      m_TutorName = TName;    // this breaks!!
}
___________________________________________________
I've tried this with m_TutorName as both public and private.
Please help me see what I'm doing wrong!
0
Comment
Question by:accidentprone
15 Comments
 
LVL 7

Expert Comment

by:galkin
ID: 1308095
Where is your message handler?
0
 
LVL 1

Expert Comment

by:Blondie050798
ID: 1308096
I'd like to know what TName is when it enters the function..can you put a TRACE in and detail the result?
0
 
LVL 8

Expert Comment

by:gelbert
ID: 1308097
Your TName may be NULL or corrupted pointer. Check it is value in debuger.
0
 

Author Comment

by:accidentprone
ID: 1308098
Running the debugger, I get that TName = 0x0042276c "stat.mwd", when I begin SetTutName, so that is correct. I got kiched out to
...\mfc\src\STRCORE.cpp, like this:
_____________________________
void CString::AllocBeforeWrite(int nLen)
{
      if (GetData()->nRefs > 1 || nLen >  GetData()->nAllocLength) // breaking here!
      {
            Release();
            AllocBuffer(nLen);
      }
      ASSERT(GetData()->nRefs <= 1);
}
__________________________________
and the debugger tells me this:
-      this      0x0012fb58 {""}
-        m_pchData        0x00000000 ""
            CXX0030: Error: expression cannot be evaluated
        nLen      8
 

If I try to F10 or F11 the function, I get a message box saying:
"Unhandled exception in fe517.exe (MFC42D.DLL): 0xC0000005: Access Violation"

Also, galkin, my message handler is in another file: it looks like this:
headerinfo:
___________________________________________
class CTutorDlg : public CDialog
{
// Construction
public:
      CTutorDlg(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
      //{{AFX_DATA(CTutorDlg)
      enum { IDD = IDD_TUTORIALDLG };
      CString      m_TutName;
      //}}AFX_DATA


// Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CTutorDlg)
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      //}}AFX_VIRTUAL

// Implementation
protected:

      // Generated message map functions
      //{{AFX_MSG(CTutorDlg)
      virtual void OnOK();
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};

and the implementation looks like this:
___________________________________________
void CTutorDlg::OnOK()
{
      CDialog::OnOK();

      AfxMessageBox (m_TutName);

      CFe517App* pApp;                        
      pApp -> SetTutName (m_TutName);      
}


0
 

Author Comment

by:accidentprone
ID: 1308099
Adjusted points to 78
0
 

Author Comment

by:accidentprone
ID: 1308100
I also want to mention that if there is a better or easier way to be doing this, that will definitely suffice for an answer.

The idea here is to get a string (CString) out of a CComboBox and into a function somewhere else that can use it.

I'd be grateful if you told me how YOU'd do such a task...see, I even ADDED 48 POINTS!
0
 

Author Comment

by:accidentprone
ID: 1308101
I also want to mention that if there is a better or easier way to be doing this, that will definitely suffice for an answer.

The idea here is to get a string (CString) out of a CComboBox and into a function somewhere else that can use it.

I'd be grateful if you told me how YOU'd do such a task...see, I even ADDED 48 POINTS!
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:accidentprone
ID: 1308102
Well, I think I need to change my question, because I have figured out what I did wrong, but I don't know yet how to do it right.

I think I was  getting a runtime error because, in the message handler, I was creating a pointer to a new copy of the calling object, and not the calling object itself.

I have overridden OnOK() to return a string, but I don't know how to grab hold of it before the dialog box exits.

Thanks for reading this far!
0
 

Author Comment

by:accidentprone
ID: 1308103
Well, I think I need to change my question, because I have figured out what I did wrong, but I don't know yet how to do it right.

I think I was  getting a runtime error because, in the message handler, I was creating a pointer to a new copy of the calling object, and not the calling object itself.

I have overridden OnOK() to return a string, but I don't know how to grab hold of it before the dialog box exits.

Thanks for reading this far!
0
 

Author Comment

by:accidentprone
ID: 1308104
Well, I think I need to change my question, because I have figured out what I did wrong, but I don't know yet how to do it right.

I think I was  getting a runtime error because, in the message handler, I was creating a pointer to a new copy of the calling object, and not the calling object itself.

I have overridden OnOK() to return a string, but I don't know how to grab hold of it before the dialog box exits.

Thanks for reading this far!
0
 

Author Comment

by:accidentprone
ID: 1308105
Well, I think I need to change my question, because I have figured out what I did wrong, but I don't know yet how to do it right.

I think I was  getting a runtime error because, in the message handler, I was creating a pointer to a new copy of the calling object, and not the calling object itself.

I have overridden OnOK() to return a string, but I don't know how to grab hold of it before the dialog box exits.

Thanks for reading this far!
0
 

Author Comment

by:accidentprone
ID: 1308106
Well, I think I need to change my question, because I have figured out what I did wrong, but I don't know yet how to do it right.

I think I was  getting a runtime error because, in the message handler, I was creating a pointer to a new copy of the calling object, and not the calling object itself.

I have overridden OnOK() to return a string, but I don't know how to grab hold of it before the dialog box exits.

Thanks for reading this far!
0
 

Author Comment

by:accidentprone
ID: 1308107
Well, I think I need to change my question, because I have figured out what I did wrong, but I don't know yet how to do it right.

I think I was  getting a runtime error because, in the message handler, I was creating a pointer to a new copy of the calling object, and not the calling object itself.

I have overridden OnOK() to return a string, but I don't know how to grab hold of it before the dialog box exits.

Thanks for reading this far!
0
 

Accepted Solution

by:
javan earned 70 total points
ID: 1308108
I don't know if this answers your first question, but I think this will answer the question you posed in your last comment.  To get a CString from a combo box in another function?

In the function where you want something to happen, do the following

CString sSelection;

//get the currently selected item.
CComboBox *pCombo = (CComboBox*)GetDlgItem(IDD_COMBOID);

int nCurSel = pCombo->GetCurSel();
if(nCurSel == -1)
     return false;

pCombo->GetLBText(nCurSel, sSelection);


0
 

Author Comment

by:accidentprone
ID: 1308109
This was very good, but because I wanted to get the string out of
the dialog box, the code I ended up using looked like this:


BOOL CFe517App::OnFileViewTutorials()
{
        CTutorDlg      tutordlg;
      if (tutordlg.DoModal () == IDOK)
      {
            m_TutorName = tutordlg.m_TutName;
            CWinApp::OpenDocumentFile (m_TutorName);
            return true;
      }
      return false;
}
thank you very much!!!
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Different colored text in ComboBox without Subclassing 8 55
Unix / Linux grid computing 5 149
Thin secure Windows 10 5 76
Not needed 13 95
Here is how to use MFC's automatic Radio Button handling in your dialog boxes and forms.  Beginner programmers usually start with a OnClick handler for each radio button and that's just not the right way to go.  MFC has a very cool system for handli…
Introduction: Finishing the grid – keyboard support for arrow keys to manoeuvre, entering the numbers.  The PreTranslateMessage function is to be used to intercept and respond to keyboard events. Continuing from the fourth article about sudoku. …
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now