CDialog Access Violation Problem



  • Hi !

    Folgendes Problem:

    Ich hab unter VS2008 einen neuen CDialog erstellt (über Assistent) den ich nun aufrufen möchte mit DoModal() -> bekomm aber immer eine Access Violation!

    Dialog Klasse

    // RegTestApiDialog .h
    
    class RegTestApiDialog : public CDialog
    {
    	DECLARE_DYNAMIC(RegTestApiDialog)
    
    public:
    	RegTestApiDialog(LPVOID lpvParent, CWnd* pParent = NULL);   // standard constructor
    
    	virtual ~RegTestApiDialog();
    	afx_msg void OnEnChangeFilechooser();
    	afx_msg void OnBnClickedOk();
    
    // Dialog Data
    	enum { IDD = IDD_REG_TEST_API_PATH };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    	DECLARE_MESSAGE_MAP()
    
    };
    
    // RegTestApiDialog.cpp
    
    #include "RegTestApiDialog.h"
    
    // RegTestApiDialog dialog
    
    IMPLEMENT_DYNAMIC(RegTestApiDialog, CDialog)
    
    RegTestApiDialog::RegTestApiDialog(LPVOID lpvParent, CWnd* pParent)
    	: CDialog(RegTestApiDialog::IDD, pParent)
    {
    
    }
    
    RegTestApiDialog::~RegTestApiDialog()
    {
    }
    
    void RegTestApiDialog::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(RegTestApiDialog, CDialog)
    	ON_EN_CHANGE(IDC_FILECHOOSER, &RegTestApiDialog::OnEnChangeFilechooser)
    	ON_BN_CLICKED(IDOK, &RegTestApiDialog::OnBnClickedOk)
    END_MESSAGE_MAP()
    
    ...
    

    Nun deklariere ich in der Main Klasse eine Member Variable von RegTestApiDialog

    private:
    	RegTestApiDialog *m_regTestApiDialog;
    

    und initalisiere und verwende sie wie folgt in der Main cpp

    m_regTestApiDialog = new RegTestApiDialog(this); // im Konstruktor
    
    ...
    
    m_regTestApiDialog->DoModal(); // in einer Methode der Main cpp (hier passiert der Fehler)
    

    Fehler Meldung:

    Unhandled exception at 0x0050af7e in CCTop2.exe: 0xC0000005: Access violation reading location 0x00000000.
    

    Hab ich da was übersehen ?!

    Danke und mfg


  • Mod

    1. Warum arbeitest Du hier mit einem Zeiger und new?
    2. Was sagt denn der Debugger? Der bleibt doch genau an der entsprechenden Stelle stehen und Du kannst im Callstack sehen, wer wen aufgerufen hat und warum evtl. ein Zeiger 0 ist...



  • Der Debugger sagt nur dass die entsprechende Methode in der ich DoModal() verwende aufgerufen wird -> dann kommt eben besagte Access Violation !

    Schön langsam ärgert mich das Problem!

    Jemand nen Tip?

    mfg leon22


  • Mod

    Dann ist der Zeiger m_regTestApiDialog ungültig.
    Schau ihn Dir im Quick-View an.

    - oder zeige mehr Code -



  • Du hattest Recht! Der Zeiger war null (obwohl ich nicht weiß warum)

    Nun erzeuge ich das Objekt direkt in meiner Methode (gleich wie vorher im Konstruktor) und hab folgenden Fehler bei DoModal():

    in afxwin1.inl

    _AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
    	{ ASSERT(afxCurrentResourceHandle != NULL);
    		return afxCurrentResourceHandle; }
    

    Habs auch mal statisch probiert (also einfach RegTestApi regTestApi und dann ein DoModal -> selber Fehler)

    Danke für eure Hilfe !

    mfg


  • Mod

    Wo erzeugst Du den Dialog? Sieht zumindest so aus, als ober der MFC Init Code zuvor nicht abgelaufen ist. Sonst wäre das Resource-Handle gesetzt.

    Wird das in einer globalen statischen Variable initialisiert?



  • Wie gesagt erzeugt wird er in einer Methode der Main Klasse:

    // in h: RegTestApiDialog *m_regTestApiDialog;
    
    m_regTestApiDialog = new RegTestApiDialog(this);
    m_regTestApiDialog->DoModal();
    
    // oder so
    
    RegTestApiDialog regTestapiDlg;
    regTestapiDlg.DoModal();
    

    Es kommt aber zum selben Fehler !

    mfg


  • Mod

    Was ist bitte Deine "Main" Klasse?
    Was verstehst Du darunter?
    Wo erzeugst Du dann das Objekt für diese "Main"-Klasse


Log in to reply