Wo muss ich den Login-Dialog platzieren?



  • Ich habe eine SDI-Anwendung und möchte nach Erstellung des Hauptfensters meinen Login-Dialog anzeigen. Dieser liest die Informationen aus einer Datenbank und überprüft sie mit den Eingaben. Im Falle der nicht korrekten Eingabe soll das Programm geschlossen werden.
    Ich habe das derzeit in der InitInstance des Hauptobjektes nach dem Eintrag m_pMainWnd->UpdateWindow() gemacht. Das funktioniert zwar, allerdings ist der Exitcode 0x2, was mich da vermuten lässt, dass da was nicht stimmt.
    Meine Frage jetzt: wo platziert man dies am besten bzw. wie realisiere ich sowas korrekt?


  • Mod

    Wann ist der ExitCode 0x2?
    Wenn das MainFrame bereits existiert solltest Du auch den Mainframe zerstören wenn der Login fehlschlägt.



  • Martin Richter schrieb:

    Wann ist der ExitCode 0x2?
    Wenn das MainFrame bereits existiert solltest Du auch den Mainframe zerstören wenn der Login fehlschlägt.

    Zerstört es sich nicht selbst wenn man die InitInstance mit return FALSE verlässt?


  • Mod

    Nö. Warum sollte das so sein? Du hast doch das Fenster erzeugt, also bist Du verantwortlich für das zerstören.



  • Martin Richter schrieb:

    Nö. Warum sollte das so sein? Du hast doch das Fenster erzeugt, also bist Du verantwortlich für das zerstören.

    Na weil das Framework das auch macht:

    BOOL CMyApp::InitInstance()
    {
    	// InitCommonControls() ist für Windows XP erforderlich, wenn ein Anwendungsmanifest
    	// die Verwendung von ComCtl32.dll Version 6 oder höher zum Aktivieren
    	// von visuellen Stilen angibt. Ansonsten treten beim Erstellen von Fenstern Fehler auf.
    	InitCommonControls();
    
    	CWinApp::InitInstance();
    
    	// OLE-Bibliotheken initialisieren
    	if (!AfxOleInit())
    	{
    		AfxMessageBox(IDP_OLE_INIT_FAILED);
    		return FALSE;
    	}
    	AfxEnableControlContainer();
    	// Standardinitialisierung
    	// Wenn Sie diese Features nicht verwenden und die Größe
    	// der ausführbaren Datei verringern möchten, entfernen Sie
    	// die nicht erforderlichen Initialisierungsroutinen.
    	// Ändern Sie den Registrierungsschlüssel unter dem Ihre Einstellungen gespeichert sind.
    	// TODO: Ändern Sie diese Zeichenfolge entsprechend,
    	// z.B. zum Namen Ihrer Firma oder Organisation.
    	SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));
    	LoadStdProfileSettings(4);  // Standard INI-Dateioptionen laden (einschließlich MRU)
    	// Dokumentvorlagen der Anwendung registrieren. Dokumentvorlagen
    	//  dienen als Verbindung zwischen Dokumenten, Rahmenfenstern und Ansichten.
    	CSingleDocTemplate* pDocTemplate;
    	pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CMyAppDoc),
    		RUNTIME_CLASS(CMainFrame),       // Haupt-SDI-Rahmenfenster
    		RUNTIME_CLASS(CMyAppView));
    	if (!pDocTemplate)
    		return FALSE;
    	AddDocTemplate(pDocTemplate);
    	// Befehlszeile parsen, um zu prüfen auf Standardumgebungsbefehle DDE, Datei offen
    	CCommandLineInfo cmdInfo;
    	ParseCommandLine(cmdInfo);
    	// Verteilung der in der Befehlszeile angegebenen Befehle. Es wird FALSE zurückgegeben, wenn
    	// die Anwendung mit /RegServer, /Register, /Unregserver oder /Unregister gestartet wurde.
    	if (!ProcessShellCommand(cmdInfo))
    		return FALSE;
    	// Das einzige Fenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden.
    	m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
    	m_pMainWnd->UpdateWindow();
    
    	CLogin	LoginDialog;
    	if (!(LoginDialog.DoModal()==IDOK))
    	{
    		return FALSE;
    	}
    
    	// Rufen Sie DragAcceptFiles nur auf, wenn eine Suffix vorhanden ist.
    	//  In einer SDI-Anwendung ist dies nach ProcessShellCommand erforderlich
    	return TRUE;
    }
    

    Schlagen die obigen Initialisierungen fehl, so wird das Programm doch komplett gekillt. Und vor dem Aufruf m_pMainWnd->ShowWindow(SW_SHOWNORMAL) wird wohl das Fenster schon existieren müssen.
    Aber meine Frage ist damit noch nicht ganz beantwortet. Wo platziere ich diese Login-Geschichte am besten?



  • Hi,

    der Platz dürfte schon richtig sein, jedenfalls nutze ich für solche Zwecke dieselbe Stelle.
    Wenn dein Login fehlschlägt, mußt du aber der Applikation mitteilen, dass sie sich beenden soll. Also entweder über ExitInstanz() oder aber WM_CLOSE an deine Applikation senden.

    Mfg

    Wilfried


  • Mod

    AndyDD schrieb:

    Martin Richter schrieb:

    Nö. Warum sollte das so sein? Du hast doch das Fenster erzeugt, also bist Du verantwortlich für das zerstören.

    Na weil das Framework das auch macht:

    Tut es nur, wenn das Fenster zerstört wird 😉
    Das wird es aber nicht.

    @wilfried.h:
    Warum WM_CLOSE senden, wenn ein trivialer DestroyWindow alles ist was man braucht?



  • Erst mal danke euch beiden. Ich habe das jetzt so gemacht:

    BOOL CMyApp::InitInstance()
    {
    ...
    	m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
    	m_pMainWnd->UpdateWindow();
    
    	CLogin	LoginDialog;
    	if (!(LoginDialog.DoModal()==IDOK))
    	{
    		DestroyWindow(m_pMainWnd->m_hWnd);
    	}
    
    	// Rufen Sie DragAcceptFiles nur auf, wenn eine Suffix vorhanden ist.
    	//  In einer SDI-Anwendung ist dies nach ProcessShellCommand erforderlich
    	return TRUE;
    }
    

    Jetzt kommt eine Warnung: Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.
    Muss ich da jetzt FALSE zurückgeben? Das ist mir jetzt noch nicht so klar.


  • Mod

    Ja! Du musst FALSE zurückgeben.



  • Martin Richter schrieb:

    Ja! Du musst FALSE zurückgeben.

    Danke jetzt funktioniert es richtig. Hätte ich ja auch selber drauf kommen können. Also vielen Dank.


Anmelden zum Antworten