2016-05-01 3 views
0

J'ai essayé de comprendre cela pendant des heures maintenant, et je suis à bout de nerfs. J'apprécierais sûrement si quelqu'un pourrait me dire quand je fais mal.Impossible de créer la fenêtre principale?

Après avoir trouvé des tutoriels C++ MFC, j'ai essayé de faire une simple application graphique en C++, mais il semble y avoir un problème à générer la fenêtre principale (dialog?). Quand je suis en train de compiler le code, le message suivant apparaît:

exception non gérée à 0x00E7A9DC dans GUI_Employee_0501.exe: 0xC0000005: Accès emplacement de lecture de violation 0xFEFEFF66.

et le point d'arrêt arrête l'intérieur WINMAIN.CPP, à pThread-> m_pMainWnd-> DestroyWindow();. La valeur pThread-> m_pMainWnd est NULL, que je soupçonne être la cause du problème.

Pouvez-vous préciser quel est le problème ici? J'ai un exemple de code et c'est très similaire au mien mais ça fonctionne, donc je n'ai vraiment aucune idée de ce qui se passe!

#include <afxwin.h> 
#include "resource.h" 
#include <iostream> 
using namespace std; 

#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console") 

CEdit *pFNAME; 
CEdit *pLNAME; 
CEdit *pSALARY; 
CEdit *pDDAY; 
CEdit *pMMONTH; 
CEdit *pYYEAR; 

CComboBox *pGENDER; 

CButton *pADD; 
CButton *pDELETE; 
CButton *pSAVE; 
CButton *pLOAD; 

class ENTRY_FORM : public CDialog 
{ 
public: 
    ENTRY_FORM(CWnd* pParent = NULL) : CDialog(ENTRY_FORM::IDD, pParent) { } 
    enum { IDD = dialog_main }; 
protected: 
    virtual void DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } 

    virtual BOOL OnInitDialog() 
    { 
     CDialog::OnInitDialog(); 
     SetUpInterfacePointers(); 
     return true; 
    } 

    void SetUpInterfacePointers(){ ... does its own thing ... } 

public: 
    afx_msg void add() { PRESS_ADD(); } 

    void PRESS_ADD() { ... does its own thing ... } 

    DECLARE_MESSAGE_MAP() 
}; 

class Program : public CWinApp 
{ 
public: 
    Program(){ } 

public: 
    virtual BOOL InitInstance() 
    { 
     CWinApp::InitInstance(); 
     cout << "CWinAPP:initInstance" << endl; 
     ENTRY_FORM dlg; 
     m_pMainWnd = &dlg;     
     cout << "mpMainWnd" << endl; 
     INT_PTR nResponse = dlg.DoModal(); 
     return FALSE; 
    } 
}; 

// 
BEGIN_MESSAGE_MAP(ENTRY_FORM, CDialog) 
    ON_COMMAND(button_add, add) 
END_MESSAGE_MAP() 
// 

Program theApp; 
+0

Il semble que vous ayez des problèmes avec C++ et essayez d'apprendre MFC sans connaître l'API Windows. Cela ne va pas bien se terminer. À tout le moins, vous devez être intimement familier avec C++ ou l'API Windows, idéalement les deux, avant d'essayer de s'attaquer à MFC. Si vous ignorez le conseil, vous perdrez du temps, seulement pour vous retrouver avec ce qu'on appelle souvent [la programmation du culte de la cargaison] (https://en.wikipedia.org/wiki/Cargo_cult_programming). – IInspectable

+0

@IInspectable Je pense que vous avez raison. Merci pour le conseil. –

Répondre

2

Variation InitInstance():

return FALSE; 

à

return TRUE; 

En effet, CWinApp::InitInstance doit retourner FALSE uniquement en cas d'échec, et TRUE si tout est bien passé l'initialisation. En cas d'échec, AfxWinMain va essayer de détruire la fenêtre pointée par m_pMainWnd, ce qui n'est pas possible (cela provoque un comportement indéterminé) car vous affectez à m_pMainWnd un objet local (qui est détruit une fois InitInstance terminé).

[modifier]

S.B Bae - de mener une enquête plus loin et trouver une cause racine, vous aurez besoin de déboguer endroit où m_pMainWnd doit être réglé sur NULL une fois que vos extrémités de dialogue. Cela devrait être dans CWnd::OnNcDestroy() dans wincore.cpp. Il y a une ligne pThread->m_pMainWnd = NULL; qui n'est apparemment pas exécutée dans votre application.

+1

Non! C'est la manière standard de créer les programmes MFC Dialog. Juste en créer un avec l'assistant. m_pMainWnd est généralement réinitialisé à nullptr, lorsque le dialogue est détruit. – xMRi

+0

@xMRi Je suis d'accord, j'ai mis à jour la réponse – marcinj